{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6137491c",
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5",
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:50.455480Z",
     "iopub.status.busy": "2025-04-22T13:34:50.455123Z",
     "iopub.status.idle": "2025-04-22T13:34:52.054361Z",
     "shell.execute_reply": "2025-04-22T13:34:52.053731Z"
    },
    "papermill": {
     "duration": 1.606832,
     "end_time": "2025-04-22T13:34:52.055859",
     "exception": false,
     "start_time": "2025-04-22T13:34:50.449027",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d3d44e5d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:52.064948Z",
     "iopub.status.busy": "2025-04-22T13:34:52.064619Z",
     "iopub.status.idle": "2025-04-22T13:34:52.128352Z",
     "shell.execute_reply": "2025-04-22T13:34:52.127805Z"
    },
    "papermill": {
     "duration": 0.069581,
     "end_time": "2025-04-22T13:34:52.129708",
     "exception": false,
     "start_time": "2025-04-22T13:34:52.060127",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "data = pd.read_csv(r'/kaggle/input/jd-comments-sampled/jd_comments_sampled.csv')\n",
    "df = data.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b82ac7b5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:52.138378Z",
     "iopub.status.busy": "2025-04-22T13:34:52.138164Z",
     "iopub.status.idle": "2025-04-22T13:34:52.150563Z",
     "shell.execute_reply": "2025-04-22T13:34:52.150022Z"
    },
    "papermill": {
     "duration": 0.01781,
     "end_time": "2025-04-22T13:34:52.151560",
     "exception": false,
     "start_time": "2025-04-22T13:34:52.133750",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def map_sentiment(sentiment_type):\n",
    "    if sentiment_type == '好评':\n",
    "        return 2\n",
    "    elif sentiment_type == '中评':\n",
    "        return 1\n",
    "    elif sentiment_type == '差评':\n",
    "        return 0\n",
    "    else:\n",
    "        return -1 # 处理未知类型\n",
    "\n",
    "df['标签'] = df['评价类型'].apply(map_sentiment)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cd124440",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:52.159728Z",
     "iopub.status.busy": "2025-04-22T13:34:52.159519Z",
     "iopub.status.idle": "2025-04-22T13:34:55.019609Z",
     "shell.execute_reply": "2025-04-22T13:34:55.018732Z"
    },
    "papermill": {
     "duration": 2.865755,
     "end_time": "2025-04-22T13:34:55.020955",
     "exception": false,
     "start_time": "2025-04-22T13:34:52.155200",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Dumping model to file cache /tmp/jieba.cache\n",
      "Loading model cost 0.660 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "训练集大小: 2100, 测试集大小: 900\n"
     ]
    }
   ],
   "source": [
    "import jieba\n",
    "import re\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "def clean_text(text):\n",
    "    text = re.sub(r'\\s+', ' ', text) # 替换空白符为一个空格\n",
    "    text = re.sub(r'\\n', ' ', text) # 去除换行符\n",
    "    text = re.sub(r'[^\\w\\s]', '', text) # 移除标点符号 (可以根据需要调整，保留部分标点可能有用)\n",
    "    text = text.strip()\n",
    "    return text\n",
    "\n",
    "df['清洗后内容'] = df['内容'].apply(clean_text)\n",
    "\n",
    "try:\n",
    "    with open('/kaggle/input/hit-stopwords/hit_stopwords.txt', 'r', encoding='utf-8') as f:\n",
    "        stopwords = set([line.strip() for line in f])\n",
    "except FileNotFoundError:\n",
    "    print(\"警告: 未找到停用词文件 'hit-stopwords.txt'，将使用内置的简单列表。\")\n",
    "\n",
    "def tokenize_jieba(text):\n",
    "    words = jieba.lcut(text)\n",
    "    # 去除停用词和单字词 (可选)\n",
    "    words = [word for word in words if word not in stopwords and len(word) > 1]\n",
    "    return \" \".join(words) # 返回以空格分隔的词语字符串，方便后续处理\n",
    "\n",
    "df['分词后内容'] = df['清洗后内容'].apply(tokenize_jieba)\n",
    "\n",
    "# 使用 '分词后内容' 进行TF-IDF/Word2Vec；使用 '清洗后内容' 进行BERT\n",
    "X_train_text, X_test_text, y_train, y_test = train_test_split(\n",
    "    df['分词后内容'], df['标签'], test_size=0.3, random_state=42, stratify=df['标签']\n",
    ")\n",
    "X_train_bert, X_test_bert, _, _ = train_test_split( # BERT用未分词的文本\n",
    "    df['清洗后内容'], df['标签'], test_size=0.3, random_state=42, stratify=df['标签']\n",
    ")\n",
    "print(f\"\\n训练集大小: {len(X_train_text)}, 测试集大小: {len(X_test_text)}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8e7dc1da",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:55.030716Z",
     "iopub.status.busy": "2025-04-22T13:34:55.030349Z",
     "iopub.status.idle": "2025-04-22T13:34:55.085979Z",
     "shell.execute_reply": "2025-04-22T13:34:55.085182Z"
    },
    "papermill": {
     "duration": 0.061702,
     "end_time": "2025-04-22T13:34:55.087286",
     "exception": false,
     "start_time": "2025-04-22T13:34:55.025584",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.font_manager as fm\n",
    "from matplotlib.font_manager import FontProperties\n",
    "font_dir = '/kaggle/input/fontss/SIMHEI.TTF'\n",
    "font_prop = FontProperties(fname=font_dir)\n",
    "\n",
    "# 添加字体到字体管理器\n",
    "font_path = fm.findfont(font_prop)\n",
    "fm.fontManager.addfont(font_path)\n",
    "\n",
    "# 设置Matplotlib的rc参数以使用该字体\n",
    "plt.rcParams['font.family'] = font_prop.get_name()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2ef0ae26",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:34:55.096801Z",
     "iopub.status.busy": "2025-04-22T13:34:55.096563Z",
     "iopub.status.idle": "2025-04-22T13:35:53.731113Z",
     "shell.execute_reply": "2025-04-22T13:35:53.730212Z"
    },
    "papermill": {
     "duration": 58.640572,
     "end_time": "2025-04-22T13:35:53.732410",
     "exception": false,
     "start_time": "2025-04-22T13:34:55.091838",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-04-22 13:35:41.318981: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
      "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
      "E0000 00:00:1745328941.513196      18 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
      "E0000 00:00:1745328941.571921      18 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 3.1 TF-IDF ---\n",
      "TF-IDF 向量维度: (2100, 5000)\n",
      "\n",
      "TF-IDF + Logistic Regression 性能:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "          差评       0.69      0.67      0.68       300\n",
      "          中评       0.67      0.68      0.67       300\n",
      "          好评       0.94      0.96      0.95       300\n",
      "\n",
      "    accuracy                           0.77       900\n",
      "   macro avg       0.77      0.77      0.77       900\n",
      "weighted avg       0.77      0.77      0.77       900\n",
      "\n",
      "加权 F1 分数 (Weighted F1-Score): 0.7681\n",
      "加权平均 OvR AUC (Weighted Avg OvR AUC): 0.8997\n",
      "TF-IDF 模型混淆矩阵图已保存为 confusion_matrix_tfidf.png\n"
     ]
    },
    {
     "data": {
      "image/png": "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VCmFh4fr1VdfVfPmzd0WKTRu3FiDBw/Wzp071bJlS1fScdmff/6pLl26qFChQipSpIh69Oihixcvus5nZmbq1VdfVYkSJRQYGKiGDRtmWX07c+ZMVahQQf7+/qpYsaK++eabK76/q32W58+fV7du3RQSEqJChQqpe/fuunDhguv85T/n4cOHq1ixYipUqJB69uyZ7b87FStW1KZNm1SpUiUNHTpUhmEoLS3NNTT8v8eQIUNkt9vd+qhbt64cDofq1KmjYcOG6euvv9Z9992nBg0aqEqVKvr444+VlJSkunXruiVy1apV0wcffCA/Pz+NHz9ejRs3dus3MzNTqampkqTKlSu7qvEzZ87Uo48+qoMHD2Z5P4ZhaM2aNapcubIkyeFwaMSIEerdu7dsNpvGjRunzz//PFufDXArIxFEvuHt7X3V4+OPP/7X/YaGhioxMTEXI817Q4YM0dtvv63evXsrLi5OKSkpatiwoSvBOX/+vNq0aaNHHnlEcXFxOnjwoOLj47VkyRJFRkZm6zXefvttxcXFacqUKfryyy+VmJio7t27S/przufleZ8ffPCBNm7cmKPKqmEYatasmVasWKHp06fr448/1rZt29S+ffscfhp/9bdx40aNHj1ajzzyiGtu6QsvvKBvvvlGkyZN0uzZsxUfH69HH33U9by1a9eqT58++u9//6tp06ZpxowZqly5cpZEbP/+/brvvvtUunRp1yKHyx577DFt3rxZn376qaZMmaL58+e7rVKdNGmS3nvvPcXExCguLk4hISFq166d6/yWLVv07LPPqk2bNvr+++8VHR2tJ598Un/88Ue233urVq20ZMkSTZ06VR9++KEWL16cZcHU+PHjFRcXpxkzZui1117TpEmTtHDhwmy9hnTp78rSpUv1xRdfyGKx6J133lFiYuJVj//9DKtWraq1a9dq9OjRql+/vp5//nmlpKQoOTlZrVq1Ut26dZWYmKhz5865jqSkJNntdg0aNEjbtm2Tv7+/goODFRISosOHD+upp56St7e3mjZtKkkqUKCAWxJZunRpFShQIMt7sVgsGjlypPr06aOMjAy99tpr2r17txo3bqzffvtNmZmZunjxon777TclJCTot99+y/bnBNxSDCCXdenSxahWrVqW9ttvv92Q5Ha8+OKLrvNbt2696nH27Fm3vho1amRER0e7tR08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d5/efvttFShQQF5eXq7FLt9//70mT54si8Uiq9Uqf39/jR079ro+P+BmREUQt5z9+/dr9erVWrJkiUaNGqU+ffrkeNg0O55++mk9/fTT//r5q1atUmBgoFtbtWrVXHsfvvvuuwoJCVHlypUVExMjPz8/vfjii5Iu/ZBbt26dFi9erMjISKWlpal06dIqWLBgtl9/8+bN+vnnn/X666/L19dXX331lcLCwrIMlderV09Tp05VQECAjhw5ohIlSuiee+75x/6bNGmievXqqUuXLho5cqT8/f31xhtv6J577nElcDnVokUL1axZU8OGDdPSpUtVpkwZPfXUU3rxxRd1/vx5FS9eXMOHD9fOnTs1ZcoUSZc+qy+++EKRkZEqUqSILl68qIiIiGxXfu677z41bNhQTz75pN555x0FBATojTfeUGZmpqs6vG/fPn366acaNmyYQkNDFRsbKx8fH1cFLDU1VX369JHFYlH58uW1Zs0apaenu6qW/+TyvphPP/20azP0V199VQ888ECWFbbXY9iwYUpLS9Mrr7wi6a9qY3p6ur799lvXVizt2rVzLUp677331LBhQ9edPb755hs1b95cNptNd955pyRp9+7dknTF6t/l1d9/N3XqVO3YsUP//e9/dccdd+iJJ55QWFiY212CruXycPjixYslXVp1vH//fvn7+7tiaN++vSIjIzVixAgZhqGUlBQFBQVlq3/gluKBeYm4xV1rscjLL7+cK69xrcUi+v9J4DVr1jSmT5/+j8+70S4vFrnScXmxgtPpNN59912jRIkShq+vr/Hggw8ae/fudfVx5MgRIzg42ChSpIjh7e1tSDKsVqvRr1+/LK93tcUiR44cMZ544gmjSJEihr+/vxEVFWWsW7cuy3V79uwx7r33XsPX19cIDw83Fi1alOUaXWVByZ9//mk8/fTTRlBQkBEeHm507tzZOHXqVLY/qy5duhiVK1d2a5s3b54hyfj5558Nw7i0uKZnz55GeHi4UaBAAePhhx82EhISXNfPnz/f8PPzM0JDQw2r1WpIMgoUKGB8/fXXrmsaNWpkDBo06KpxnD592ujUqZMRHBxshISEGO3atTOOHDniOp+UlGR0797dKF68uOHr62tUrVrViIuLc+tj5MiRRrly5Qw/Pz+jdOnSxn//+98rvtbVPsvk5GSja9euRnBwsBEcHGx0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AAAmRUUQAACYmokLglQEAQAAzIqKIAAAMDWriUuCVAQBAABMioogAAAwNRMXBEkEAQCAubF9DAAAAEyHiiAAADA1q3kLglQEAQAAzIqKIAAAMDXmCAIAAMB0qAgCAABTM3FBkIogAACAWVERBAAApmaReUuCJIIAAMDU2D4GAAAApkNFEAAAmBrbxwAAAMB0qAgCAABTM3FBkIogAACAWVERBAAApmY1cUmQiiAAAIBJUREEAACmZuKCIIkgAAAwN7aPAQAAgOlQEQQAAKZm4oIgFUEAAACzoiIIAABMje1jAAAAYDpUBAEAgKmZtx5IRRAAAMC0qAgCAABTM/M+giSCAADA1KzmzQOzPzScnp6unj17urXt379f7du3v+K1AAAAyN+ynQh6e3srLi7OrW3nzp1Zkr7MzEwVKFAgd6IDAADIYxaLJc+O/C7biaDFYtG5c+dUvnx5rV27VpK0aNEitWvXTseOHdPRo0clSV5eXvL29s6baAEAAJBrsjVHMCUlRZ999pkCAgI0b948VapUSUlJSfrhhx905swZJSUlqU+fPmrfvr2eeeYZ+fj45HXcAAAAueImKNzlmWxVBA8dOqQhQ4YoLS3NleSNHTtWL7zwgpYsWaIePXpo165dqlKlip5//nk5HI48DRoAAADXL1uJYKVKlbR//3699tpraty4sb777jstWbJEvXr1kr+/vyQpIiJCPXv2VHx8vLy8WIwMAABuDswRzIYjR44oOTlZcXFx6tixowYPHuyqDq5evVp33323ihQpovj4+DwLFgAAALkn24lgSkqKVq1apTvvvFODBg3SSy+9pOTkZDmdTpUuXVoxMTE6c+aMatasmZfxAgAA5CqrJe+O/C7bY7jnz59XQkKCSpQooQMHDujAgQN65ZVXdPHiRUVERKh06dKaP3++KlasmJfxAgAA5KqbYQg3r2SrIrhy5Uq1aNFCt99+uw4ePKjQ0FD997//1TfffKM333xTGRkZqlKlimJjY3X+/Pm8jhkAAAC5IFuJ4L333quYmBgdPXpUH3zwgSQpJCRE3bp10x9//CFvb2/9+OOPiouLU+3atVk1DAAAbhqWPDzyu2wlgl5eXnr++ef1008/adKkSfryyy8lSdHR0frss8904cIFFStWTJLkdDqVkpKSdxEDAAAgV+Ron5cKFSroq6++UoUKFSRJUVFR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\n",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from gensim.models import Word2Vec\n",
    "from transformers import BertTokenizer, BertModel\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from sklearn.metrics import confusion_matrix, f1_score, roc_auc_score, classification_report\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from pylab import mpl\n",
    "\n",
    "# --- 3.1 TF-IDF ---\n",
    "print(\"\\n--- 3.1 TF-IDF ---\")\n",
    "tfidf_vectorizer = TfidfVectorizer(max_features=5000) # 限制特征数量\n",
    "X_train_tfidf = tfidf_vectorizer.fit_transform(X_train_text)\n",
    "X_test_tfidf = tfidf_vectorizer.transform(X_test_text)\n",
    "print(f\"TF-IDF 向量维度: {X_train_tfidf.shape}\")\n",
    "\n",
    "# # (可选) 使用TF-IDF训练一个简单的分类器作为基线\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "lr_tfidf = LogisticRegression()\n",
    "lr_tfidf.fit(X_train_tfidf, y_train)\n",
    "y_pred_tfidf = lr_tfidf.predict(X_test_tfidf)\n",
    "\n",
    "\n",
    "print(\"\\nTF-IDF + Logistic Regression 性能:\")\n",
    "print(classification_report(y_test, y_pred_tfidf, target_names=['差评', '中评', '好评']))\n",
    "\n",
    "# 1. 计算加权 F1 分数\n",
    "# classification_report 中已经包含了 weighted avg f1-score，这里显式计算一下\n",
    "f1_tfidf_weighted = f1_score(y_test, y_pred_tfidf, average='weighted')\n",
    "print(f\"加权 F1 分数 (Weighted F1-Score): {f1_tfidf_weighted:.4f}\")\n",
    "\n",
    "# 2. 计算 AUC (需要概率)\n",
    "# 多分类 AUC 通常使用 One-vs-Rest (OvR) 或 One-vs-One (OvO) 策略计算\n",
    "# 需要模型的 predict_proba 输出\n",
    "try:\n",
    "    y_prob_tfidf = lr_tfidf.predict_proba(X_test_tfidf)\n",
    "    # 使用 One-vs-Rest (OvR) 策略，并计算加权平均 AUC\n",
    "    auc_tfidf_weighted_ovr = roc_auc_score(y_test, y_prob_tfidf, multi_class='ovr', average='weighted')\n",
    "    print(f\"加权平均 OvR AUC (Weighted Avg OvR AUC): {auc_tfidf_weighted_ovr:.4f}\")\n",
    "except ValueError as e:\n",
    "    print(f\"计算 AUC 时出错: {e}. 可能某些类别在测试集中样本过少或模型无法预测概率。\")\n",
    "\n",
    "# 3. 绘制混淆矩阵\n",
    "cm_tfidf = confusion_matrix(y_test, y_pred_tfidf)\n",
    "class_names = ['差评', '中评', '好评'] # 确保标签顺序与你的映射一致 (0, 1, 2)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm_tfidf, annot=True, fmt='d', cmap='Blues',\n",
    "            xticklabels=class_names, yticklabels=class_names)\n",
    "\n",
    "plt.title('TF-IDF + Logistic Regression 混淆矩阵')\n",
    "plt.xlabel('预测标签')\n",
    "plt.ylabel('真实标签')\n",
    "plt.savefig('confusion_matrix_tfidf.png') # 保存图像\n",
    "print(\"TF-IDF 模型混淆矩阵图已保存为 confusion_matrix_tfidf.png\")\n",
    "plt.show() # 在交互式环境中显示图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5187090e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:35:53.745132Z",
     "iopub.status.busy": "2025-04-22T13:35:53.744495Z",
     "iopub.status.idle": "2025-04-22T13:35:55.181359Z",
     "shell.execute_reply": "2025-04-22T13:35:55.180622Z"
    },
    "papermill": {
     "duration": 1.444585,
     "end_time": "2025-04-22T13:35:55.182734",
     "exception": false,
     "start_time": "2025-04-22T13:35:53.738149",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 3.2 Word2Vec ---\n",
      "Word2Vec 向量维度: (2100, 100)\n",
      "\n",
      "Word2Vec + Logistic Regression 性能:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "          差评       0.61      0.70      0.65       300\n",
      "          中评       0.60      0.46      0.52       300\n",
      "          好评       0.79      0.87      0.83       300\n",
      "\n",
      "    accuracy                           0.68       900\n",
      "   macro avg       0.67      0.68      0.67       900\n",
      "weighted avg       0.67      0.68      0.67       900\n",
      "\n",
      "加权 F1 分数 (Weighted F1-Score): 0.6673\n",
      "加权平均 OvR AUC (Weighted Avg OvR AUC): 0.8442\n",
      "Word2Vec 模型混淆矩阵图已保存为 confusion_matrix_w2v.png\n"
     ]
    },
    {
     "data": {
      "image/png": "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MtCqVSukpaVhw4YNAIDAwEC0b98eKpUKPXr0wMmTJ3H48GHk5eVh0aJF6NSpU5HeO28NExEREZnYwYMHERMTg5iYGISEhOjb4+PjsW7dOvj7+2Pq1KlQKpU4fvw4AKB8+fJYunQpunTpAhsbGzg4OOjXGDQWE0EiIiKSWml4wpyfn5/BE0Me5unpidjYWJw9exa+vr5wdnbW7xs1ahQ6deqEv//+G61atYKNjU2RrstEkIiIiKRWFp41XLFiRXTt2vWR+7y8vAyWkSkKjhEkIiIikhQrgkRERCS1slARLC6sCBIRERFJihVBIiIikhorgkREREQkHVYEiYiISGoSFwRZESQiIiKSFSuCREREJDWZxwgyESQiIiKpyZwI8tYwERERkaRYESQiIiKpsSJIRERERNJhRZCIiIikJnFBkBVBIiIiIlmxIkhERERS4xhBIiIiIpIOK4JEREQkN4krgkwEiYiISGq8NUxERERE0mFFkIiIiKQmcUGQFUEiIiIiWbEiSERERFLjGEEiIiIikg4rgkRERCQ1VgSJiIiISDqsCBIREZHUZK4IMhEkIiIiqUmcB/LWMBEREZGsWBEkIiIiqcl8a5gVQSIiIiJJsSJIREREUpO5IvjCJYIzevYydQhEhXx/caepQyAy8EHDUaYOgciArdrB1CFI6YVLBImIiIiKQuaKIMcIEhEREUmKFUEiIiKSmswVQSaCREREJDWJ80DeGiYiIiKSFSuCREREJDWZbw2zIkhEREQkKVYEiYiISGqsCBIRERGRdFgRJCIiIqmxIkhERERE0mFFkIiIiKQmcUGQFUEiIiIiWbEiSERERFKTeYwgE0EiIiKSm8SJIG8NExEREUmKFUEiIiKSmsy3hlkRJCIiIpIUK4JEREQkNaW8BUFWBImIiIhkxYogERERSY1jBImIiIhIOqwIEhERkdSUElcEmQgSERGR1HhrmIiIiIikw4ogERERSU3mqpjM752IiIhIaqwIEhERkdRknizCiiARERGRpFgRJCIiIqlx1jARERERSYcVQSIiIpKazGMEmQgSERGR1HhrmIiIiIikw4ogERERSU3mqpjM752IiIhIaqwIEhERkdRknizCiiARERGRpFgRJCIiIqlx1jARERERSYcVQSIiIpKazGMEmQgSERGR1ORNA3lrmIiIiEharAgSERGR1GS+NcyK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xo3DkCFD0LFjR6SlpWHDhg0YNmwYAgMD0b59e6hUqudyXZM9Yq64cIwglUYcI0ilDccIUmljyjGCSVkJxda3m5Wn0cfOmDEDq1evhkqlwuDBgxEYGAhra2vs2bMH/v7+sLS0hFKpxPHjxwstufesmAgSlQAmglTaMBGk0oaJ4JPdunULZ8+eha+vL5ydnZ9Ln4CJbw0TERERmVppuDX8NBUrVkTXrl2fe78mf9YwEREREZkGK4JEREQkudJfESwurAgSERERSYoVQSIiIpKavPVAVgSJiIiIpMWKIBEREUmtOB8xV9oxESQiIiLJyZsI8tYwERERkaRYESQiIiKpyVsPZEWQiIiISFqsCBIREZHk5K0JsiJIREREJClWBImIiEhqMi8fw4ogERERkaSYCBIRERFJireGiYiISGoKThYhIiIiItmwIkhERERSY0WQiIiIiKTDRJCIiIhIUkwEiYiIiCTFMYJEREQkNS4oTURERETSYSJIREREJCneGiYiIiKpcfkYIiIiIpIOK4JEREQkOVYEiYiIiEgyrAgSERGR1OStB7IiSERERCQtVgSJiIhIalxQmoiIiIikw4ogERERSU7eiiATQSIiIpKavGkgbw0TERERSYsVQSIiIpKcvDVBVgSJiIiIJMWKIBEREUmNy8cQERERkXSYCBIRERFJiokgERERkaQ4RpCIiIikppB41jATQSIiIpKcvIkgbw0TERERSYoVQSIiIpKavPVAVgSJiIiIpMWKIBEREUmNC0oTERERkXRYESQiIiLJsSJIRERERJJhRZCIiIikJm89kIkgERERSU/eVJC3homIiIgkxYogERERSY3LxxARERGRdJgIEhEREUmKiSARERGRpDhGkIiIiKSm4KxhIiIiIpKNQgghTB0ElT4ajQZBQUGYMWMGLCwsTB0OEb+TVCrxe0llHRNBeqS0tDTY29sjNTUVdnZ2pg6HiN9JKpX4vaSyjreGiYiIiCTFRJCIiIhIUkwEiYiIiCTFRJAeycLCAgEBARz8TKUGv5NUGvF7SWUdJ4sQERERSYoVQSIiIiJJMREkIiIikhQTQQk9ajRAfn5+obbk5GTs3r1b/zorK+uRx+Xm5iInJ+f5Bkn0GPxeUkmIioqCVqs16lh+J6ksYyIooa5duyI0NFT/+vfff0edOnWQlpZmcFx8fDwGDx6Mffv2AQCaNm2K8uXLw9nZGZaWlrCysoKzszMqVKiAd955p0TfA724evfujWnTpj12P7+XVNyEEGjatCnOnDkDAMjLy3tkYvcAv5NUlpmZOgAqGbm5uVCpVFCpVBgyZAj27t2Lrl27AgC++OIL9OvXD3Z2dtDpdNBqtVCr1XjllVewdu1ajBw5EgkJCYiOjtb39/7776N8+fKYM2eOid4RvajUajXMzc0fu5/fSypuSUlJcHZ2hq+vLwDgxx9/xPTp06FSqfTH3L59G/Xq1cOZM2f4naQyjYmgJMaPH489e/YY/IBVKBRwd3eHUllQGP7222+Rn5+PAQMGYMmSJQAAf39/NGvWDObm5li7di18fX1Rv359g74XLlzI33TpmezatQsTJkwwaLt37x7MzMywadMmg/aDBw+iZs2aAPi9pOIhhEBeXh7+/PNPNGvWTN8+aNAgDBo0SP96+/btGDVqFBYsWKBv43eSyireGpbEmjVrkJCQgPj4eCQkJODo0aNwcHBAQkKCfouNjcWVK1ewZMkSaDQa6HQ6AIC3tzcAIC4uDoGBgQb96nQ6fP7550+s4BA9jkajKfQ97NmzJyZMmGDQdvXqVf3x/F5Scbl+/TqqVKmC/v37IywsDJ6enlCpVIiIiNAfs2LFCkyYMAFHjhzB66+/zu8klXlMBCXi6+sLDw8PeHp6onHjxtBqtfD29oanpyc8PT3h5eWFGjVqAADeffddqNVqKJVKLFu2DEBBVXHXrl24ceOGvs/9+/fDwsIC/v7+pnhLVMY9qEYbeyy/l1Sc3N3dcefOHdSvXx87d+7EuXPnoFarUa9ePf0xK1euxNq1a/XVPn4nqaxjIigBnU6H/Px8/PHHH0hMTERCQgJeeeUVrFixwqDqkpiYiGvXriE3NxebNm2CVqvFkCFDYG5uDp1Oh4oVK+Krr74yGCfj4OCANWvWQKlUPnI2MtGTKBSKIh3P7yUVt5SUFFy5cgXNmzfH6dOn8fLLL0OhUOgnizg6OsLS0hJAwSSSr7/+mt9JKtM4RlAC4eHh6Nu3L9RqNRQKBVJSUpCbm4vY2NhCA5gfjJF5+DdZpVKJAwcOoGfPnrCysoJCoUB2djYUCgWWLVsGnU6H3NxchIaG4vXXXy/hd0dl2YNbasYe+3DiyO8lFYdt27ahS5cuMDMzQ1hYGDp06ICWLVsiJiYGarUaGRkZ6NatG8zMzJCbm4tdu3ahY8eOAPidpLKJiaAEWrRooU/sUlNT0aRJE6xcuRKdOnUyuo+GDRsiLy9P/5oz4eh5UCqVuHnzJjw9PfVtDyaLbNy4Ud/m7Oz8yKSR30t63hISEnDmzBmcPXsW33//PXbu3Gkw3s/X1xcLFixA27ZtH3k+v5NU1vDWsETS0tLQpUsXuLu7o1+/fnB3d4erqysqVqwIT09PuLi4YPz48YXOu3jxInx9ffVrahE9L3369MHt27efOlnk3r17eOmllwzO5feSisMnn3yCmTNnon379rC3t0eDBg2MPpffSSqLWBGUxKlTpzBkyBD07NlTvzQMUPDbqoODAz755JNC5wghkJiYiC1btmDjxo3w8fEpyZCJHonfSypur776KiwsLHDv3j3MnTsXAQEBTzye30kqy5gISmD37t3o168fFi5ciHHjxj31eK1WC5VKhaysLGRmZmL//v1o165doWM44JmKg1arfeLYQX4vqTidP38ePXr0wOeff45mzZqhRYsWcHNzw/DhwwEUTBD530lO/E5SWcZEUALdunXDr7/+iqZNm6JcuXIwNzfXL9vx4AfuypUrART8I9eiRQscPHgQ1tbWCA8Pf+QSH9nZ2XxmJhWL9PR05ObmPnY/v5dUXH799Vd069YNK1euRN++fQEAx44dg7u7Ow4cOIDVq1cjKirKYEwrwO8klW0KwV9ViIiIoNPpEBkZicaNGxfal5CQgPXr16NHjx689UsvFCaCRERERJLirGEiIiIiSTERJCIiIpIUE0EiIiIiSTERJCIiIpIUE0EiKhZZWVnIz883aNPpdMjKygIAZGZmGtXP9evXcf78+ecSU15eHo4dO1ZoncLz588bHQ8R0YuEs4aJ6D+rWLEi7O3tYWlpidTUVPTt2xd//vknkpKSkJGRgeTkZHh7e0Or1cLZ2RlHjx5F/fr14efnh/nz52PBggUGydnLL78MPz8/AMDy5ctx5swZfPvtt/r9H330EXJycrB48WJotVrk5eWhXLlyBjHl5eVBqVRCpVLp27788kvMmDED+/btg62tLaysrFClShVUq1YNAQEBGDFiBHQ6HfLy8mBhYVHMnxoRkelxQWki+s9u3boFAIiNjUXz5s0xbNgw1K5dGwAQEhKCX3/9Fd98843BOTt37kSfPn3QtWtXLFiwAMHBwQAKHoeY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\n",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# --- 3.2 Word2Vec ---\n",
    "print(\"\\n--- 3.2 Word2Vec ---\")\n",
    "# 准备Word2Vec训练语料 (需要是词语列表的列表)\n",
    "sentences = [text.split() for text in X_train_text]\n",
    "w2v_model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4, sg=1) # sg=1: Skip-Gram\n",
    "\n",
    "# 定义函数将文本转换为句向量 (简单平均)\n",
    "def get_sentence_vector(text, model):\n",
    "    words = text.split()\n",
    "    vector = np.zeros(model.vector_size)\n",
    "    count = 0\n",
    "    for word in words:\n",
    "        if word in model.wv:\n",
    "            vector += model.wv[word]\n",
    "            count += 1\n",
    "    if count != 0:\n",
    "        vector /= count\n",
    "    return vector\n",
    "\n",
    "X_train_w2v = np.array([get_sentence_vector(text, w2v_model) for text in X_train_text])\n",
    "X_test_w2v = np.array([get_sentence_vector(text, w2v_model) for text in X_test_text])\n",
    "print(f\"Word2Vec 向量维度: {X_train_w2v.shape}\")\n",
    "\n",
    "# (可选) 使用Word2Vec训练一个简单的分类器\n",
    "lr_w2v = LogisticRegression()\n",
    "lr_w2v.fit(X_train_w2v, y_train)\n",
    "y_pred_w2v = lr_w2v.predict(X_test_w2v)\n",
    "print(\"\\nWord2Vec + Logistic Regression 性能:\")\n",
    "print(classification_report(y_test, y_pred_w2v, target_names=['差评', '中评', '好评']))\n",
    "\n",
    "f1_w2v_weighted = f1_score(y_test, y_pred_w2v, average='weighted')\n",
    "print(f\"加权 F1 分数 (Weighted F1-Score): {f1_w2v_weighted:.4f}\")\n",
    "\n",
    "# 2. 计算 AUC (需要概率)\n",
    "try:\n",
    "    y_prob_w2v = lr_w2v.predict_proba(X_test_w2v)\n",
    "    # 使用 One-vs-Rest (OvR) 策略，并计算加权平均 AUC\n",
    "    auc_w2v_weighted_ovr = roc_auc_score(y_test, y_prob_w2v, multi_class='ovr', average='weighted')\n",
    "    print(f\"加权平均 OvR AUC (Weighted Avg OvR AUC): {auc_w2v_weighted_ovr:.4f}\")\n",
    "except ValueError as e:\n",
    "    print(f\"计算 AUC 时出错: {e}. 可能某些类别在测试集中样本过少或模型无法预测概率。\")\n",
    "\n",
    "\n",
    "# 3. 绘制混淆矩阵\n",
    "cm_w2v = confusion_matrix(y_test, y_pred_w2v)\n",
    "# class_names 已在上面定义过\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm_w2v, annot=True, fmt='d', cmap='Greens', # 使用不同颜色主题区分\n",
    "            xticklabels=class_names, yticklabels=class_names)\n",
    "plt.title('Word2Vec + Logistic Regression 混淆矩阵')\n",
    "plt.xlabel('预测标签')\n",
    "plt.ylabel('真实标签')\n",
    "plt.savefig('confusion_matrix_w2v.png') # 保存图像\n",
    "print(\"Word2Vec 模型混淆矩阵图已保存为 confusion_matrix_w2v.png\")\n",
    "plt.show() # 在交互式环境中显示图像\n",
    "# --- 新增代码结束 ---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "96d8653f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:35:55.196078Z",
     "iopub.status.busy": "2025-04-22T13:35:55.195853Z",
     "iopub.status.idle": "2025-04-22T13:35:58.771733Z",
     "shell.execute_reply": "2025-04-22T13:35:58.770920Z"
    },
    "papermill": {
     "duration": 3.583714,
     "end_time": "2025-04-22T13:35:58.772900",
     "exception": false,
     "start_time": "2025-04-22T13:35:55.189186",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 3.3 BERT ---\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "09db3248b98048e1adca61e789652a6d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer_config.json:   0%|          | 0.00/49.0 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "39c112c52eeb4e4c813266632a7478be",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "vocab.txt:   0%|          | 0.00/110k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "db00ce19e8b64b8cb62bc162cff1e447",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer.json:   0%|          | 0.00/269k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "51897fc101d24570a9bff831712d9b42",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "config.json:   0%|          | 0.00/624 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Xet Storage is enabled for this repo, but the 'hf_xet' package is not installed. Falling back to regular HTTP download. For better performance, install the package with: `pip install huggingface_hub[hf_xet]` or `pip install hf_xet`\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "883914ee085f471eb52857c4e6d1207d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/412M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BERT模型将在 cuda 上运行。\n"
     ]
    }
   ],
   "source": [
    "# --- 3.3 BERT ---\n",
    "print(\"\\n--- 3.3 BERT ---\")\n",
    "# 使用 Hugging Face Transformers 库\n",
    "PRETRAINED_MODEL_NAME = 'bert-base-chinese'\n",
    "tokenizer = BertTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)\n",
    "bert_model = BertModel.from_pretrained(PRETRAINED_MODEL_NAME)\n",
    "\n",
    "# 将BERT模型移到GPU（如果可用）\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "bert_model.to(device)\n",
    "print(f\"BERT模型将在 {device} 上运行。\")\n",
    "\n",
    "# 定义一个简单的 PyTorch Dataset\n",
    "class ReviewDataset(Dataset):\n",
    "    def __init__(self, texts, labels, tokenizer, max_len):\n",
    "        self.texts = texts\n",
    "        self.labels = labels\n",
    "        self.tokenizer = tokenizer\n",
    "        self.max_len = max_len\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.texts)\n",
    "\n",
    "    def __getitem__(self, item):\n",
    "        text = str(self.texts[item])\n",
    "        label = self.labels[item]\n",
    "\n",
    "        encoding = self.tokenizer.encode_plus(\n",
    "            text,\n",
    "            add_special_tokens=True,\n",
    "            max_length=self.max_len,\n",
    "            return_token_type_ids=False,\n",
    "            padding='max_length',\n",
    "            truncation=True,\n",
    "            return_attention_mask=True,\n",
    "            return_tensors='pt',\n",
    "        )\n",
    "\n",
    "        return {\n",
    "            'text': text,\n",
    "            'input_ids': encoding['input_ids'].flatten(),\n",
    "            'attention_mask': encoding['attention_mask'].flatten(),\n",
    "            'labels': torch.tensor(label, dtype=torch.long)\n",
    "        }\n",
    "\n",
    "MAX_LEN = 128 # BERT输入的最大长度\n",
    "BATCH_SIZE = 16 # 根据你的GPU显存调整\n",
    "\n",
    "# 注意：要将 Series 转换为 list 才能正确索引\n",
    "train_dataset = ReviewDataset(\n",
    "    texts=X_train_bert.tolist(),\n",
    "    labels=y_train.tolist(),\n",
    "    tokenizer=tokenizer,\n",
    "    max_len=MAX_LEN\n",
    ")\n",
    "test_dataset = ReviewDataset(\n",
    "    texts=X_test_bert.tolist(),\n",
    "    labels=y_test.tolist(),\n",
    "    tokenizer=tokenizer,\n",
    "    max_len=MAX_LEN\n",
    ")\n",
    "\n",
    "train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False)\n",
    "\n",
    "# 检查DataLoader输出\n",
    "data_iter = iter(train_loader)\n",
    "sample_batch = next(data_iter)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5a8a002a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T13:35:58.788285Z",
     "iopub.status.busy": "2025-04-22T13:35:58.788032Z",
     "iopub.status.idle": "2025-04-22T14:19:04.609401Z",
     "shell.execute_reply": "2025-04-22T14:19:04.608710Z"
    },
    "papermill": {
     "duration": 2585.830831,
     "end_time": "2025-04-22T14:19:04.610706",
     "exception": false,
     "start_time": "2025-04-22T13:35:58.779875",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "开始训练 BERT 分类模型...\n",
      "Epoch 1/100\n",
      "----------\n",
      "训练集 Loss: 1.0322 Accuracy: 0.4729\n",
      "验证集 Loss: 0.9148 Accuracy: 0.6278\n",
      "Epoch 2/100\n",
      "----------\n",
      "训练集 Loss: 0.8932 Accuracy: 0.5933\n",
      "验证集 Loss: 0.8134 Accuracy: 0.6467\n",
      "Epoch 3/100\n",
      "----------\n",
      "训练集 Loss: 0.8062 Accuracy: 0.6419\n",
      "验证集 Loss: 0.7540 Accuracy: 0.6833\n",
      "Epoch 4/100\n",
      "----------\n",
      "训练集 Loss: 0.7656 Accuracy: 0.6567\n",
      "验证集 Loss: 0.7131 Accuracy: 0.6856\n",
      "Epoch 5/100\n",
      "----------\n",
      "训练集 Loss: 0.7324 Accuracy: 0.6624\n",
      "验证集 Loss: 0.6792 Accuracy: 0.6978\n",
      "Epoch 6/100\n",
      "----------\n",
      "训练集 Loss: 0.6960 Accuracy: 0.6757\n",
      "验证集 Loss: 0.6564 Accuracy: 0.7056\n",
      "Epoch 7/100\n",
      "----------\n",
      "训练集 Loss: 0.6721 Accuracy: 0.7019\n",
      "验证集 Loss: 0.6424 Accuracy: 0.7122\n",
      "Epoch 8/100\n",
      "----------\n",
      "训练集 Loss: 0.6597 Accuracy: 0.6938\n",
      "验证集 Loss: 0.6441 Accuracy: 0.6856\n",
      "Epoch 9/100\n",
      "----------\n",
      "训练集 Loss: 0.6487 Accuracy: 0.6924\n",
      "验证集 Loss: 0.6131 Accuracy: 0.7211\n",
      "Epoch 10/100\n",
      "----------\n",
      "训练集 Loss: 0.6426 Accuracy: 0.6986\n",
      "验证集 Loss: 0.5979 Accuracy: 0.7244\n",
      "Epoch 11/100\n",
      "----------\n",
      "训练集 Loss: 0.6300 Accuracy: 0.6981\n",
      "验证集 Loss: 0.5878 Accuracy: 0.7311\n",
      "Epoch 12/100\n",
      "----------\n",
      "训练集 Loss: 0.6121 Accuracy: 0.7124\n",
      "验证集 Loss: 0.5847 Accuracy: 0.7278\n",
      "Epoch 13/100\n",
      "----------\n",
      "训练集 Loss: 0.6058 Accuracy: 0.7186\n",
      "验证集 Loss: 0.5745 Accuracy: 0.7311\n",
      "Epoch 14/100\n",
      "----------\n",
      "训练集 Loss: 0.6129 Accuracy: 0.7124\n",
      "验证集 Loss: 0.5652 Accuracy: 0.7378\n",
      "Epoch 15/100\n",
      "----------\n",
      "训练集 Loss: 0.5979 Accuracy: 0.7033\n",
      "验证集 Loss: 0.5635 Accuracy: 0.7333\n",
      "Epoch 16/100\n",
      "----------\n",
      "训练集 Loss: 0.5976 Accuracy: 0.7129\n",
      "验证集 Loss: 0.5577 Accuracy: 0.7411\n",
      "Epoch 17/100\n",
      "----------\n",
      "训练集 Loss: 0.5986 Accuracy: 0.7152\n",
      "验证集 Loss: 0.5535 Accuracy: 0.7456\n",
      "Epoch 18/100\n",
      "----------\n",
      "训练集 Loss: 0.5882 Accuracy: 0.7076\n",
      "验证集 Loss: 0.5535 Accuracy: 0.7378\n",
      "Epoch 19/100\n",
      "----------\n",
      "训练集 Loss: 0.5776 Accuracy: 0.7181\n",
      "验证集 Loss: 0.5422 Accuracy: 0.7467\n",
      "Epoch 20/100\n",
      "----------\n",
      "训练集 Loss: 0.5677 Accuracy: 0.7190\n",
      "验证集 Loss: 0.5415 Accuracy: 0.7467\n",
      "Epoch 21/100\n",
      "----------\n",
      "训练集 Loss: 0.5612 Accuracy: 0.7295\n",
      "验证集 Loss: 0.5418 Accuracy: 0.7500\n",
      "Epoch 22/100\n",
      "----------\n",
      "训练集 Loss: 0.5656 Accuracy: 0.7286\n",
      "验证集 Loss: 0.5398 Accuracy: 0.7422\n",
      "Epoch 23/100\n",
      "----------\n",
      "训练集 Loss: 0.5718 Accuracy: 0.7333\n",
      "验证集 Loss: 0.5318 Accuracy: 0.7478\n",
      "Epoch 24/100\n",
      "----------\n",
      "训练集 Loss: 0.5679 Accuracy: 0.7333\n",
      "验证集 Loss: 0.5293 Accuracy: 0.7444\n",
      "Epoch 25/100\n",
      "----------\n",
      "训练集 Loss: 0.5565 Accuracy: 0.7276\n",
      "验证集 Loss: 0.5311 Accuracy: 0.7433\n",
      "Epoch 26/100\n",
      "----------\n",
      "训练集 Loss: 0.5621 Accuracy: 0.7243\n",
      "验证集 Loss: 0.5230 Accuracy: 0.7478\n",
      "Epoch 27/100\n",
      "----------\n",
      "训练集 Loss: 0.5591 Accuracy: 0.7390\n",
      "验证集 Loss: 0.5254 Accuracy: 0.7522\n",
      "Epoch 28/100\n",
      "----------\n",
      "训练集 Loss: 0.5438 Accuracy: 0.7395\n",
      "验证集 Loss: 0.5291 Accuracy: 0.7456\n",
      "Epoch 29/100\n",
      "----------\n",
      "训练集 Loss: 0.5509 Accuracy: 0.7338\n",
      "验证集 Loss: 0.5201 Accuracy: 0.7533\n",
      "Epoch 30/100\n",
      "----------\n",
      "训练集 Loss: 0.5415 Accuracy: 0.7457\n",
      "验证集 Loss: 0.5318 Accuracy: 0.7511\n",
      "Epoch 31/100\n",
      "----------\n",
      "训练集 Loss: 0.5406 Accuracy: 0.7462\n",
      "验证集 Loss: 0.5274 Accuracy: 0.7433\n",
      "Epoch 32/100\n",
      "----------\n",
      "训练集 Loss: 0.5523 Accuracy: 0.7238\n",
      "验证集 Loss: 0.5201 Accuracy: 0.7467\n",
      "Epoch 33/100\n",
      "----------\n",
      "训练集 Loss: 0.5483 Accuracy: 0.7352\n",
      "验证集 Loss: 0.5143 Accuracy: 0.7511\n",
      "Epoch 34/100\n",
      "----------\n",
      "训练集 Loss: 0.5454 Accuracy: 0.7338\n",
      "验证集 Loss: 0.5111 Accuracy: 0.7511\n",
      "Epoch 35/100\n",
      "----------\n",
      "训练集 Loss: 0.5516 Accuracy: 0.7329\n",
      "验证集 Loss: 0.5223 Accuracy: 0.7444\n",
      "Epoch 36/100\n",
      "----------\n",
      "训练集 Loss: 0.5381 Accuracy: 0.7414\n",
      "验证集 Loss: 0.5150 Accuracy: 0.7489\n",
      "Epoch 37/100\n",
      "----------\n",
      "训练集 Loss: 0.5157 Accuracy: 0.7590\n",
      "验证集 Loss: 0.5112 Accuracy: 0.7511\n",
      "Epoch 38/100\n",
      "----------\n",
      "训练集 Loss: 0.5464 Accuracy: 0.7333\n",
      "验证集 Loss: 0.5100 Accuracy: 0.7578\n",
      "Epoch 39/100\n",
      "----------\n",
      "训练集 Loss: 0.5451 Accuracy: 0.7329\n",
      "验证集 Loss: 0.5195 Accuracy: 0.7478\n",
      "Epoch 40/100\n",
      "----------\n",
      "训练集 Loss: 0.5467 Accuracy: 0.7348\n",
      "验证集 Loss: 0.5085 Accuracy: 0.7544\n",
      "Epoch 41/100\n",
      "----------\n",
      "训练集 Loss: 0.5273 Accuracy: 0.7490\n",
      "验证集 Loss: 0.5084 Accuracy: 0.7511\n",
      "Epoch 42/100\n",
      "----------\n",
      "训练集 Loss: 0.5225 Accuracy: 0.7490\n",
      "验证集 Loss: 0.5079 Accuracy: 0.7544\n",
      "Epoch 43/100\n",
      "----------\n",
      "训练集 Loss: 0.5231 Accuracy: 0.7457\n",
      "验证集 Loss: 0.5040 Accuracy: 0.7522\n",
      "Epoch 44/100\n",
      "----------\n",
      "训练集 Loss: 0.5359 Accuracy: 0.7367\n",
      "验证集 Loss: 0.5078 Accuracy: 0.7533\n",
      "Epoch 45/100\n",
      "----------\n",
      "训练集 Loss: 0.5417 Accuracy: 0.7381\n",
      "验证集 Loss: 0.5011 Accuracy: 0.7589\n",
      "Epoch 46/100\n",
      "----------\n",
      "训练集 Loss: 0.5259 Accuracy: 0.7452\n",
      "验证集 Loss: 0.5042 Accuracy: 0.7522\n",
      "Epoch 47/100\n",
      "----------\n",
      "训练集 Loss: 0.5218 Accuracy: 0.7362\n",
      "验证集 Loss: 0.5022 Accuracy: 0.7589\n",
      "Epoch 48/100\n",
      "----------\n",
      "训练集 Loss: 0.5206 Accuracy: 0.7438\n",
      "验证集 Loss: 0.5148 Accuracy: 0.7611\n",
      "Epoch 49/100\n",
      "----------\n",
      "训练集 Loss: 0.5294 Accuracy: 0.7371\n",
      "验证集 Loss: 0.4987 Accuracy: 0.7567\n",
      "Epoch 50/100\n",
      "----------\n",
      "训练集 Loss: 0.5220 Accuracy: 0.7405\n",
      "验证集 Loss: 0.4975 Accuracy: 0.7600\n",
      "Epoch 51/100\n",
      "----------\n",
      "训练集 Loss: 0.5303 Accuracy: 0.7457\n",
      "验证集 Loss: 0.5011 Accuracy: 0.7600\n",
      "Epoch 52/100\n",
      "----------\n",
      "训练集 Loss: 0.5218 Accuracy: 0.7543\n",
      "验证集 Loss: 0.5048 Accuracy: 0.7611\n",
      "Epoch 53/100\n",
      "----------\n",
      "训练集 Loss: 0.5236 Accuracy: 0.7495\n",
      "验证集 Loss: 0.5064 Accuracy: 0.7556\n",
      "Epoch 54/100\n",
      "----------\n",
      "训练集 Loss: 0.5188 Accuracy: 0.7371\n",
      "验证集 Loss: 0.4937 Accuracy: 0.7567\n",
      "Epoch 55/100\n",
      "----------\n",
      "训练集 Loss: 0.5214 Accuracy: 0.7529\n",
      "验证集 Loss: 0.4958 Accuracy: 0.7578\n",
      "Epoch 56/100\n",
      "----------\n",
      "训练集 Loss: 0.5279 Accuracy: 0.7348\n",
      "验证集 Loss: 0.4960 Accuracy: 0.7544\n",
      "Epoch 57/100\n",
      "----------\n",
      "训练集 Loss: 0.5125 Accuracy: 0.7495\n",
      "验证集 Loss: 0.4969 Accuracy: 0.7600\n",
      "Epoch 58/100\n",
      "----------\n",
      "训练集 Loss: 0.5197 Accuracy: 0.7490\n",
      "验证集 Loss: 0.4915 Accuracy: 0.7644\n",
      "Epoch 59/100\n",
      "----------\n",
      "训练集 Loss: 0.5256 Accuracy: 0.7414\n",
      "验证集 Loss: 0.4916 Accuracy: 0.7600\n",
      "Epoch 60/100\n",
      "----------\n",
      "训练集 Loss: 0.5212 Accuracy: 0.7410\n",
      "验证集 Loss: 0.4952 Accuracy: 0.7589\n",
      "Epoch 61/100\n",
      "----------\n",
      "训练集 Loss: 0.5208 Accuracy: 0.7538\n",
      "验证集 Loss: 0.4955 Accuracy: 0.7611\n",
      "Epoch 62/100\n",
      "----------\n",
      "训练集 Loss: 0.5215 Accuracy: 0.7457\n",
      "验证集 Loss: 0.4937 Accuracy: 0.7644\n",
      "Epoch 63/100\n",
      "----------\n",
      "训练集 Loss: 0.5115 Accuracy: 0.7524\n",
      "验证集 Loss: 0.4907 Accuracy: 0.7622\n",
      "Epoch 64/100\n",
      "----------\n",
      "训练集 Loss: 0.5025 Accuracy: 0.7538\n",
      "验证集 Loss: 0.4957 Accuracy: 0.7622\n",
      "Epoch 65/100\n",
      "----------\n",
      "训练集 Loss: 0.5174 Accuracy: 0.7481\n",
      "验证集 Loss: 0.4905 Accuracy: 0.7622\n",
      "Epoch 66/100\n",
      "----------\n",
      "训练集 Loss: 0.5179 Accuracy: 0.7490\n",
      "验证集 Loss: 0.4927 Accuracy: 0.7633\n",
      "Epoch 67/100\n",
      "----------\n",
      "训练集 Loss: 0.5054 Accuracy: 0.7633\n",
      "验证集 Loss: 0.4996 Accuracy: 0.7611\n",
      "Epoch 68/100\n",
      "----------\n",
      "训练集 Loss: 0.5127 Accuracy: 0.7433\n",
      "验证集 Loss: 0.4929 Accuracy: 0.7689\n",
      "Epoch 69/100\n",
      "----------\n",
      "训练集 Loss: 0.5203 Accuracy: 0.7410\n",
      "验证集 Loss: 0.4890 Accuracy: 0.7667\n",
      "Epoch 70/100\n",
      "----------\n",
      "训练集 Loss: 0.5116 Accuracy: 0.7448\n",
      "验证集 Loss: 0.4884 Accuracy: 0.7633\n",
      "Epoch 71/100\n",
      "----------\n",
      "训练集 Loss: 0.5036 Accuracy: 0.7681\n",
      "验证集 Loss: 0.4897 Accuracy: 0.7611\n",
      "Epoch 72/100\n",
      "----------\n",
      "训练集 Loss: 0.5156 Accuracy: 0.7490\n",
      "验证集 Loss: 0.4879 Accuracy: 0.7600\n",
      "Epoch 73/100\n",
      "----------\n",
      "训练集 Loss: 0.5275 Accuracy: 0.7457\n",
      "验证集 Loss: 0.4895 Accuracy: 0.7644\n",
      "Epoch 74/100\n",
      "----------\n",
      "训练集 Loss: 0.5142 Accuracy: 0.7543\n",
      "验证集 Loss: 0.5034 Accuracy: 0.7567\n",
      "Epoch 75/100\n",
      "----------\n",
      "训练集 Loss: 0.5271 Accuracy: 0.7352\n",
      "验证集 Loss: 0.5008 Accuracy: 0.7589\n",
      "Epoch 76/100\n",
      "----------\n",
      "训练集 Loss: 0.5080 Accuracy: 0.7433\n",
      "验证集 Loss: 0.4865 Accuracy: 0.7644\n",
      "Epoch 77/100\n",
      "----------\n",
      "训练集 Loss: 0.5128 Accuracy: 0.7457\n",
      "验证集 Loss: 0.4970 Accuracy: 0.7622\n",
      "Epoch 78/100\n",
      "----------\n",
      "训练集 Loss: 0.5092 Accuracy: 0.7486\n",
      "验证集 Loss: 0.4940 Accuracy: 0.7567\n",
      "Epoch 79/100\n",
      "----------\n",
      "训练集 Loss: 0.5021 Accuracy: 0.7538\n",
      "验证集 Loss: 0.4876 Accuracy: 0.7700\n",
      "Epoch 80/100\n",
      "----------\n",
      "训练集 Loss: 0.5090 Accuracy: 0.7510\n",
      "验证集 Loss: 0.4884 Accuracy: 0.7622\n",
      "Epoch 81/100\n",
      "----------\n",
      "训练集 Loss: 0.5084 Accuracy: 0.7524\n",
      "验证集 Loss: 0.4919 Accuracy: 0.7567\n",
      "Epoch 82/100\n",
      "----------\n",
      "训练集 Loss: 0.5060 Accuracy: 0.7567\n",
      "验证集 Loss: 0.4847 Accuracy: 0.7656\n",
      "Epoch 83/100\n",
      "----------\n",
      "训练集 Loss: 0.5084 Accuracy: 0.7529\n",
      "验证集 Loss: 0.4979 Accuracy: 0.7600\n",
      "Epoch 84/100\n",
      "----------\n",
      "训练集 Loss: 0.5142 Accuracy: 0.7486\n",
      "验证集 Loss: 0.4844 Accuracy: 0.7678\n",
      "Epoch 85/100\n",
      "----------\n",
      "训练集 Loss: 0.5158 Accuracy: 0.7495\n",
      "验证集 Loss: 0.4847 Accuracy: 0.7689\n",
      "Epoch 86/100\n",
      "----------\n",
      "训练集 Loss: 0.5091 Accuracy: 0.7519\n",
      "验证集 Loss: 0.4833 Accuracy: 0.7711\n",
      "Epoch 87/100\n",
      "----------\n",
      "训练集 Loss: 0.5041 Accuracy: 0.7457\n",
      "验证集 Loss: 0.4892 Accuracy: 0.7589\n",
      "Epoch 88/100\n",
      "----------\n",
      "训练集 Loss: 0.5152 Accuracy: 0.7505\n",
      "验证集 Loss: 0.4877 Accuracy: 0.7689\n",
      "Epoch 89/100\n",
      "----------\n",
      "训练集 Loss: 0.5045 Accuracy: 0.7529\n",
      "验证集 Loss: 0.4876 Accuracy: 0.7678\n",
      "Epoch 90/100\n",
      "----------\n",
      "训练集 Loss: 0.5145 Accuracy: 0.7419\n",
      "验证集 Loss: 0.4931 Accuracy: 0.7533\n",
      "Epoch 91/100\n",
      "----------\n",
      "训练集 Loss: 0.4998 Accuracy: 0.7557\n",
      "验证集 Loss: 0.4907 Accuracy: 0.7633\n",
      "Epoch 92/100\n",
      "----------\n",
      "训练集 Loss: 0.5079 Accuracy: 0.7495\n",
      "验证集 Loss: 0.4833 Accuracy: 0.7689\n",
      "Epoch 93/100\n",
      "----------\n",
      "训练集 Loss: 0.5122 Accuracy: 0.7457\n",
      "验证集 Loss: 0.4990 Accuracy: 0.7567\n",
      "Epoch 94/100\n",
      "----------\n",
      "训练集 Loss: 0.5118 Accuracy: 0.7481\n",
      "验证集 Loss: 0.4853 Accuracy: 0.7644\n",
      "Epoch 95/100\n",
      "----------\n",
      "训练集 Loss: 0.5102 Accuracy: 0.7457\n",
      "验证集 Loss: 0.5055 Accuracy: 0.7556\n",
      "Epoch 96/100\n",
      "----------\n",
      "训练集 Loss: 0.5037 Accuracy: 0.7510\n",
      "验证集 Loss: 0.4872 Accuracy: 0.7656\n",
      "Epoch 97/100\n",
      "----------\n",
      "训练集 Loss: 0.5116 Accuracy: 0.7495\n",
      "验证集 Loss: 0.4892 Accuracy: 0.7633\n",
      "Epoch 98/100\n",
      "----------\n",
      "训练集 Loss: 0.5131 Accuracy: 0.7524\n",
      "验证集 Loss: 0.4811 Accuracy: 0.7700\n",
      "Epoch 99/100\n",
      "----------\n",
      "训练集 Loss: 0.5087 Accuracy: 0.7481\n",
      "验证集 Loss: 0.4845 Accuracy: 0.7644\n",
      "Epoch 100/100\n",
      "----------\n",
      "训练集 Loss: 0.5108 Accuracy: 0.7500\n",
      "验证集 Loss: 0.4875 Accuracy: 0.7733\n",
      "\n",
      "训练完成。\n",
      "\n",
      "正在评估 BERT 模型在测试集上的最终性能...\n",
      "\n",
      "最终测试集 Accuracy: 0.7733\n",
      "最终测试集 Loss: 0.4875\n",
      "\n",
      "BERT 分类器性能报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "          差评       0.72      0.68      0.70       300\n",
      "          中评       0.67      0.65      0.66       300\n",
      "          好评       0.92      0.99      0.95       300\n",
      "\n",
      "    accuracy                           0.77       900\n",
      "   macro avg       0.77      0.77      0.77       900\n",
      "weighted avg       0.77      0.77      0.77       900\n",
      "\n",
      "\n",
      "--- BERT 模型补充评估指标 ---\n",
      "加权 F1 分数 (Weighted F1-Score): 0.7699\n",
      "加权平均 OvR AUC (Weighted Avg OvR AUC): 0.9065\n",
      "\n",
      "绘制 BERT 模型混淆矩阵...\n",
      "BERT 模型混淆矩阵图已保存为 confusion_matrix_bert.png\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuAAAAJOCAYAAAD2yLKXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABf2UlEQVR4nO3deVxU9f7H8fcMDKsigmumguZuLhlKlkulZbmgZRrp1Z+lbaapZWZWXs0LVm65pGmJLbaXSy4trpVpqZEbaYr7LsYqMMDM+f3BdW4TmFByBvX1vI/zyPmeM2e+MzXeD28+53sshmEYAgAAAGAKq6cnAAAAAFxNKMABAAAAE1GAAwAAACaiAAcAAABMRAEOAAAAmIgCHAAAADARBTgAAABgIgpwAAAAwEQU4AAAAICJKMABXBGOHj3q+nNqaqpmzJghu91epOempaW5PZ49e7Z27tzpevztt9/q9OnTl2aixZSamqrt27f/o3Pk5ORo27ZtbmOLFi3SV199pT/eDHn79u1q06aNvv/++wLn2Lt3rzp27KjNmzf/o7lcyNSpU/X555+XyLkBoLShAAdw2Tt9+rTq1aunt956S5Jkt9s1atQovfPOOxd97qlTp1SrVi0tXLjQNTZ+/HjFx8dLkpKSknTfffdp6NChhT6/QYMGCgoKUoUKFVShQgV5eXnp559/1scffyxvb2/XeGhoqCwWi37//fdivbeZM2cqIiJCr7zyigzD0FNPPSWr1Spvb+8Cm9VqVadOnQqcY/r06WrZsqVmzpzpGtu8ebP69eunBg0aaObMmZo8ebJuuukm1a1bV9dee22Bc6xatUqbNm1SWFiY2/isWbPUs2fPAltUVJQeffRR13EPPfSQ2/5Jkya5nSc2NlZffPFFsT4bALhcUYADcFm3bp0sFotrCw4OVseOHbVr1y7XMWFhYW7HnN/ee+89SVL79u1dYzabTfXr19e0adPkdDolSQsWLCj0+RaLRQsWLPhb8546daq8vb3VvXt3SVKlSpX0xBNP6IUXXlBSUtJfPrdy5cp66aWX1L9/f7377ruSJC8vL9lsNtntdt1zzz0KCwtzFfd/5ufnp3feeUdJSUlKSkpS1apV5efnJz8/PzVu3Ng1vmfPHtfxxTFmzBgtX75cr7/+umbOnClfX19169ZNeXl5BbYXX3xRvr6+Bc4xYsQIDRs2TEOGDNGECRMkSTExMTp69KiioqI0ZMgQPf3007rlllv07LPPFiiyJemzzz5Thw4dlJqaqn379mnPnj06duyYEhIStH37dkVGRrptN998s5o2bep6/sqVKxUUFKQ77rhDixYtUmhoqLZv365t27Zp2bJlOnPmjLp166bdu3dr9+7d2rVrl37++WdlZ2cX6/MCgMuBt6cnAKD0WbhwoerWrav09HTFxMSoU6dO+vXXX1WmTBlJUnR0tEaMGOH2nFq1arn+fMstt2jq1KlKT0/XihUrNGLECKWnp+uFF15Q165dXW0MjzzyiMqWLetKQ8PDw4s91yNHjmjWrFl65plnFBoa6hofM2aMFi5cqIcfflifffaZLBaL2/Oys7OVmJgoX19f3XXXXbr//vuVkpKigwcPyuFw6MyZM/r555+VlJSk+fPn6/Tp08rJyVHZsmV1zTXXuJ2nT58+stlskvLbWbKzs5WVlaUdO3YoODhYklytHtnZ2QoICCjWe+zQoYN27dqlgIAAjRs3TkuWLCnwfs679957C4xZrVa9/PLLqlu3rqKioiRJP/74o6ZNm6a1a9fqjTfeUMuWLfXKK6+oYcOG6tSpk8aNG6cbbrhBkvTbb79pzZo1MgxDixcvdp33ySefVNmyZVWjRg09/fTTf/kefHx81LZtW914443y8vJSjx491KJFC504cUI5OTny9fXVgAEDXMcbhiG73a5t27apXr16xfq8AKDUMwDgv9auXWtIMuLj411j+/fvNyQZK1euNAzDMGrWrGk8+eSTFzxHu3btjM6dO7uN9ezZ0wgPDy/02KioqH805zvvvNOoWbOmkZmZWWDfypUrDYvFYjz55JOG0+l02xcfH29IMmw2m1GuXDnXJsmQZAQEBLiNBwUFGb6+vsaQIUMuOqfBgwcbM2bMMAzDMI4dO2bExMT8rfd2/Phx47bbbjP27t3rGhs7dqzRsWNH48CBAwW2J5980rj33nv/8px5eXnGPffcY5QvX9544YUXjE2bNhnz5s0zkpKSDMMwjJ07dxr33HOPsWXLFtdzevbsaTRt2tSw2+1GzZo1jfnz5xtJSUlGcnKyMXbsWOP222+/6HupXbu2ERcXZ8yYMcPo1KmTazwnJ8eoUKGC8emnnxb34wGAyxYtKAD+0vmk9Z+0AkRERLhdJHmpzJgxQ998840WLFggf3//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qH379vriiy/05ZdfaujQofL395ckhYWFaciQIdqxY4e8vVndEAAAAChMkXvAjx49qrS0NC1ZskR9+vTRv//9b1ca/u2336p169aqVKmSduzYUWKTBQAAwOXNain5rbQrcgGemZmp9evXq379+ho7dqyeeOIJpaWlyel0qkaNGoqJiVFSUpJuuOGGkpwvAAAAcFkrcq9Ienq6EhISVK1aNe3fv1/79+/XU089pXPnziksLEw1atTQ0qVL1aBBg5KcLwAAAC5jl0OPdkkrUgK+bt06denSRTVr1tSBAwcUEhKi//znP/r00081ZswY5ebmqnHjxoqLi1N6enpJzxkAAAC4bBWpAL/lllsUExOjY8eOac6cOZKk4OBgDRo0SEeOHJHNZtOaNWu0ZMkS3XjjjayCAgAAgEJZTNhKuyIV4N7e3nrkkUf0ww8/aObMmfroo48kSVFRUXr//feVkZGhKlWqSJKcTqcyMzNLbsYAAADAZaxY6wXWq1dPH3/8serVqydJioyM1HPPPSdfX1/XMVarVdnZ2Zd2lgAAALgiWOkBL14BLkk333yz689eXl567rnnXI/PnTunwMBAeXl5XZrZAQAAAFeYIi9D6HQ69e2337r+XL16dde+7OxsPf/886pRo4ZOnDjxjya0du3af/R8AAAAlF4WS8lvpV2xCvDbb789/0lWq1JTUyVJmzZtUuPGjbVo0SLNnDlTlStXvui57Ha7+vbtK0mKi4vT+++/79rXuXPnYr0BAAAA4HJS5ALc29tbfn5+bo8lKTQ0VIMGDdL27dsVHR0tq/Xip7RarVq+fLkk6fTp0xo1apTq1KmjVatWyWazFfc9AAAA4DJhsVhKfCvtitUD/sfi2G6365lnnnE9Hj16tCTJ399f/fr1U+3atf/yPOcL+FGjRumZZ57RihUr5O/vT/84AAAArmjFKsANw3D92WKxqFy5cgWO+f7777V161YtW7bsL8+VmZmp8ePHFzh/dna22/j5sdjY2OJMFQAAlBLp6Wk6cuigqteoqbJBBWsHXF1KY0CdlJSkiIgIrV27VmFhYZKkoUOHasaMGa5jateurX379kmSdu7cqQEDBmjfvn0aOHCgXnnllWIl70VuQfkzHx8fjRkzRgMGDFCzZs00ZswYjRkzRo8++qirP/yvGIahM2fOuG1JSUlyOp1uY6dOndLJkyf/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AICLcDqdio+PV4sWLQrsO3jwoN566y1169aNFhOgCCjAAQAAABOxCgoAAABgIgpwAAAAwEQU4AAAAICJKMABAAAAE1GAA7jqZWZmKi8vz23M6XQqMzNTknTu3Lkinefo0aPatWvXJZlTbm6u1q5dW2Cd8V27dhV5PgCA0olVUABcVapUqaJy5crJ399fqampuu+++/TLL7/o2LFjysjIUHJysmrVqiWHw6HQ0FCtWbNGTZo0UVRUlF566SVNnDjRrSi+/vrrFRUVJUl67bXXtHnzZr333nuu/S+88IKys7P16quvyuFwKDc3V35+fm5zys3NldVqlZeXl2vsjTfe0OjRo7Vs2TKVLVtWAQEBuvbaa1W7dm2NHTtWgwYNktPpVG5urnx9fUv4UwMAXErciAfAVeXkyZOSpMTERN10000aMGCAGjRoIEmaN2+evvvuO73zzjtuz1m0aJF69uypzp07a+LEiZoyZYok6YcfftDhw4dVrVo1HT58WL6+vvL2dv9r1d/f33UDku+++04dO3ZUQECA626BeXl5ysrK0urVq9W+fXtJ0p49ezR69Ghdc8016tSpkxo0aKB27dqpXLlySktL05gxYzRixAiVK1dOUVFRmjVrVol9XgCAS48CHMBV5dy5c3ruued0+PBhxcTEuIpvSTp16pSuu+66As+pU6eOfv75Z3l5ecnHx0c9evTQ6tWr1bZtW23atEnbt2/Xhg0b3G5AcvLkSaWmpiolJUV2u127d+9W8+bNlZub+5fz+/7779WrVy+NGDFCjz/+uMLCwvTNN99o79696tq1qzZv3qy8vDxFRUXpt99+K/TuggCA0o2/uQFcVXx8fHTy5El9++236tu3r6T8ZDosLExvvPGG4uLi1LhxY9WqVUuffPKJ9u/fr9GjR7udIzU1VYMGDXI9tlqtrkT7vDVr1mjy5MlasGCBfvjhB7366qv69ddfLzgvh8MhSapXr54mT56s559/XiEhIdq/f7/mzZun9u3ba/bs2apXr54aNWqk+fPnF3hNAMDlgQIcwFXD4XDI6XRq4cKFeuyxx3T+EhiLxaKwsDAdOXJEH3/8sbZu3arWrVvL6XTK399fa9euVVRUlCu9ttlsKleu3F++1gMPPKA5c+bIbrerc+fOmjRpkh5++GEFBgYqODhYgYGBCggIUHBwsMqWLasaNWpIkipWrKjo6GhJUnJysl588UXNnDlTH374oSZMmKAXXnhBKSkpatu2LQU4AFymKMABXDXi4+N1/fXXq0GDBpo8ebIiIiLk5eXlWu3EMAy1atXKtcqIl5eXqlatqm+++Ua33XabbDabpPxC3t/f/6Kvt3r1aqWlpemdd95R//79FR8fr3PnziklJUWjR4/W448/rpSUFKWnp+vYsWOS8nvCN2zYoJEjRyo8PFx2u13x8fHq3Lmzvv/+ewUFBemGG27Qww8/rCVLlmjfvn0l9GkBAEoKBTiAq8aNN96o3377TV988YXq1aunzz//XA0bNlRQUJCk/OUIg4KCFBIS4va8smXLKioqSoZhyOFw6PTp06pYsaKk/7WOFGb69OmqXbu27r33Xm3atEnr16/X0qVLXcW2JP3222/auHGj6/HLL7+sjh07Kjk5WcOHD9e7776r8PBwVahQQdWqVdPYsWPVrFkztWvXTnFxcQXaYwAApR8XYQK4alWuXFkffPCB0tPTJUlnzpzRNddc49r/x+UGe/furSeeeEJZWVlKSEhwHZednS2n01mgEF+2bJni4+M1aNAgGYahDz/8UM2bN1etWrXcVln5/PPPNW/ePO3YsUMBAQF6+umnNWTIEAUFBSknJ0djx47V/v37dfjwYdcqKbNnz1a7du3Up0+fkvpoAAAliAQcwFWrXLlyaty4sex2uyTpp59+clsVJTs7W5K0YcMGHT58WPfdd58OHTqk5cuXq1WrVoqMjNSbb76pvLw85eTkuJ177ty5mjdvnmuN7ttuu02rVq1SpUqV1KVLF9dxTz31lHx9ffWf//xHkuTr66ugoCCdOHFCTZs2VV5eng4dOuRKug8ePKjhw4eLWzgAwOWLAhzAVa9p06aaOnWqZs2apbvvvlsfffSRJk2apB49ekiSxo4dq2eeeUaBgYFKS0vTsmXLVLlyZbVr107Hjx/Xww8/rIULF7qd8/PPP9ddd93lepybm6uxY8dq2LBhbhdP2mw2Pf/883r99dddSbwkVa1aVdddd52WLl2qm2++WTt37lRWVpY++eQT3XfffapevXoJfyoAgJJCAQ7gqpKWlqbjx4+73TCnbNmyiouLU05Oju655x698847GjRokBwOh+Li4rRlyxY9+uijysvL0+DBgzVw4ED17dtXAwcOVJ8+feRwOGS323Xq1ClXcX3+/Lm5ucrLy1N2drb69u2rvn37asmSJfr+++9dF3L26tVLO3fuVNmyZSX9r6/8xRdfVMOGDeXj46N169bJ29tbb775ph588EEZhnHRNcUBAKUTPeAAriqvvvqq3n77bT377LOSpM2bN+uhhx5SvXr19PXXX6ts2bJavny5xo4dq3bt2mnZsmV67bXXVKZMGX366ac6cuSIPv30U0n5t5k/d+6csrKy9NJLL2n69OmaN2+e2+vZ7XZlZ2erbNmyeu6551xzCAoKUr9+/STlF+vVqlWTlL8Kip+fn/z9/d1uTX9eXl6eunfvrtzcXOXk5CgjI6PAre0BAKWbxaCREMBVzOFwaMuWLWrVqlWBfUeOHCnQ6pGdnV1owZuRkSGbzebq+QYA4EIowAEAAAAT0QMOAAAAmIgCHAAAADARBTgAAABgIgpwAAAAwEQU4AAAAICJKMABAAAAE1GAAwAAACaiAAcAAABMRAEOAAAAmOj/AY15dtc5WDQeAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# --- 4.1 构建基于BERT的分类模型 ---\n",
    "class SentimentClassifier(nn.Module):\n",
    "    def __init__(self, n_classes):\n",
    "        super(SentimentClassifier, self).__init__()\n",
    "        self.bert = BertModel.from_pretrained(PRETRAINED_MODEL_NAME)\n",
    "        # 可以选择冻结BERT参数以加快训练速度，但可能会牺牲性能\n",
    "        for param in self.bert.parameters():\n",
    "            param.requires_grad = False\n",
    "        self.drop = nn.Dropout(p=0.3)\n",
    "        # BERT输出维度是768 (对于 base model)\n",
    "        self.out = nn.Linear(self.bert.config.hidden_size, n_classes)\n",
    "\n",
    "    def forward(self, input_ids, attention_mask):\n",
    "        outputs = self.bert(\n",
    "            input_ids=input_ids,\n",
    "            attention_mask=attention_mask\n",
    "        )\n",
    "        # 使用 [CLS] token 的输出 (pooled_output)\n",
    "        pooled_output = outputs.pooler_output\n",
    "        output = self.drop(pooled_output)\n",
    "        return self.out(output)\n",
    "\n",
    "N_CLASSES = len(df['标签'].unique()) # 应该为 3 (0, 1, 2)\n",
    "model = SentimentClassifier(n_classes=N_CLASSES)\n",
    "model.to(device)\n",
    "\n",
    "# 定义损失函数和优化器\n",
    "EPOCHS = 100 # 训练轮数 (实际项目中可能需要更多)\n",
    "optimizer = torch.optim.AdamW(model.parameters(), lr=0.0001) # AdamW 常用于 Transformer\n",
    "criterion = nn.CrossEntropyLoss().to(device)\n",
    "\n",
    "# --- 4.2 训练函数 ---\n",
    "def train_epoch(model, data_loader, loss_fn, optimizer, device, n_examples):\n",
    "    model.train()\n",
    "    losses = []\n",
    "    correct_predictions = 0\n",
    "\n",
    "    for d in data_loader:\n",
    "        input_ids = d[\"input_ids\"].to(device)\n",
    "        attention_mask = d[\"attention_mask\"].to(device)\n",
    "        labels = d[\"labels\"].to(device)\n",
    "\n",
    "        outputs = model(\n",
    "            input_ids=input_ids,\n",
    "            attention_mask=attention_mask\n",
    "        )\n",
    "\n",
    "        _, preds = torch.max(outputs, dim=1)\n",
    "        loss = loss_fn(outputs, labels)\n",
    "\n",
    "        correct_predictions += torch.sum(preds == labels)\n",
    "        losses.append(loss.item())\n",
    "\n",
    "        loss.backward()\n",
    "        nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) # 防止梯度爆炸\n",
    "        optimizer.step()\n",
    "        optimizer.zero_grad()\n",
    "\n",
    "    return correct_predictions.double() / n_examples, np.mean(losses)\n",
    "\n",
    "# --- 4.3 评估函数 ---\n",
    "def eval_model(model, data_loader, loss_fn, device, n_examples):\n",
    "    model.eval() # 设置为评估模式\n",
    "    losses = []\n",
    "    correct_predictions = 0\n",
    "    all_preds = []\n",
    "    all_labels = []\n",
    "    all_probs = [] # 新增：用于存储概率\n",
    "\n",
    "    with torch.no_grad(): # 评估时不需要计算梯度\n",
    "        for d in data_loader:\n",
    "            input_ids = d[\"input_ids\"].to(device)\n",
    "            attention_mask = d[\"attention_mask\"].to(device)\n",
    "            labels = d[\"labels\"].to(device)\n",
    "\n",
    "            outputs = model( # 模型输出的是原始 logits\n",
    "                input_ids=input_ids,\n",
    "                attention_mask=attention_mask\n",
    "            )\n",
    "            # 从 logits 计算概率 (应用 Softmax)\n",
    "            probs = torch.softmax(outputs, dim=1)\n",
    "            # 获取预测标签\n",
    "            _, preds = torch.max(outputs, dim=1)\n",
    "\n",
    "            # 计算损失\n",
    "            loss = loss_fn(outputs, labels)\n",
    "\n",
    "            # 收集结果\n",
    "            correct_predictions += torch.sum(preds == labels)\n",
    "            losses.append(loss.item())\n",
    "            all_preds.extend(preds.cpu().numpy())\n",
    "            all_labels.extend(labels.cpu().numpy())\n",
    "            all_probs.extend(probs.cpu().numpy()) # 收集概率\n",
    "\n",
    "    accuracy = correct_predictions.double() / n_examples\n",
    "    mean_loss = np.mean(losses)\n",
    "\n",
    "    # 返回准确率, 平均损失, 预测标签列表, 真实标签列表, 概率列表\n",
    "    return accuracy, mean_loss, all_preds, all_labels, np.array(all_probs)\n",
    "# --- 4.4 模型训练循环 ---\n",
    "print(\"\\n开始训练 BERT 分类模型...\")\n",
    "history = {'train_acc': [], 'train_loss': [], 'val_acc': [], 'val_loss': []}\n",
    "\n",
    "for epoch in range(EPOCHS):\n",
    "    print(f'Epoch {epoch + 1}/{EPOCHS}')\n",
    "    print('-' * 10)\n",
    "\n",
    "    train_acc, train_loss = train_epoch(\n",
    "        model, train_loader, criterion, optimizer, device, len(train_dataset)\n",
    "    )\n",
    "    print(f'训练集 Loss: {train_loss:.4f} Accuracy: {train_acc:.4f}')\n",
    "\n",
    "    val_acc, val_loss, _, _, _ = eval_model( \n",
    "        model, test_loader, criterion, device, len(test_dataset)\n",
    "    )\n",
    "    print(f'验证集 Loss: {val_loss:.4f} Accuracy: {val_acc:.4f}')\n",
    "\n",
    "    history['train_acc'].append(train_acc.item() if torch.is_tensor(train_acc) else train_acc)\n",
    "    history['train_loss'].append(train_loss)\n",
    "    history['val_acc'].append(val_acc.item() if torch.is_tensor(val_acc) else val_acc)\n",
    "    history['val_loss'].append(val_loss)\n",
    "\n",
    "print(\"\\n训练完成。\")\n",
    "\n",
    "# --- 4.5 获取最终测试集性能 ---\n",
    "print(\"\\n正在评估 BERT 模型在测试集上的最终性能...\")\n",
    "test_acc, test_loss, y_pred_bert, y_true_bert, y_prob_bert = eval_model(\n",
    "    model,\n",
    "    test_loader,\n",
    "    criterion, # 这里的 criterion 是 nn.CrossEntropyLoss\n",
    "    device,\n",
    "    len(test_dataset)\n",
    ")\n",
    "\n",
    "print(f\"\\n最终测试集 Accuracy: {test_acc:.4f}\")\n",
    "print(f\"最终测试集 Loss: {test_loss:.4f}\") # 也可以打印损失看看\n",
    "\n",
    "# 打印基础分类报告\n",
    "print(\"\\nBERT 分类器性能报告:\")\n",
    "class_names = ['差评', '中评', '好评'] # 确认标签顺序 (0, 1, 2)\n",
    "print(classification_report(y_true_bert, y_pred_bert, target_names=class_names))\n",
    "\n",
    "# --- 新增代码：计算 F1 和 AUC ---\n",
    "print(\"\\n--- BERT 模型补充评估指标 ---\")\n",
    "\n",
    "# 1. 计算加权 F1 分数\n",
    "# y_true_bert 和 y_pred_bert 已经是 numpy 数组或列表\n",
    "f1_bert_weighted = f1_score(y_true_bert, y_pred_bert, average='weighted')\n",
    "print(f\"加权 F1 分数 (Weighted F1-Score): {f1_bert_weighted:.4f}\")\n",
    "\n",
    "# 2. 计算加权平均 OvR AUC\n",
    "# y_prob_bert 是包含每个类别概率的 numpy 数组\n",
    "try:\n",
    "    auc_bert_weighted_ovr = roc_auc_score(y_true_bert, y_prob_bert, multi_class='ovr', average='weighted')\n",
    "    print(f\"加权平均 OvR AUC (Weighted Avg OvR AUC): {auc_bert_weighted_ovr:.4f}\")\n",
    "except ValueError as e:\n",
    "    print(f\"计算 AUC 时出错: {e}. 可能某些类别在测试集中样本过少。\")\n",
    "\n",
    "# --- 新增代码：绘制混淆矩阵 ---\n",
    "print(\"\\n绘制 BERT 模型混淆矩阵...\")\n",
    "cm_bert = confusion_matrix(y_true_bert, y_pred_bert)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm_bert, annot=True, fmt='d', cmap='Blues', # 使用 'Blues' 主题\n",
    "            xticklabels=class_names, yticklabels=class_names)\n",
    "plt.title('BERT 分类器 混淆矩阵')\n",
    "plt.xlabel('预测标签')\n",
    "plt.ylabel('真实标签')\n",
    "plt.tight_layout()\n",
    "plt.savefig('confusion_matrix_bert.png') # 保存图像\n",
    "print(\"BERT 模型混淆矩阵图已保存为 confusion_matrix_bert.png\")\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "67e87605",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:19:04.640565Z",
     "iopub.status.busy": "2025-04-22T14:19:04.640088Z",
     "iopub.status.idle": "2025-04-22T14:19:18.154806Z",
     "shell.execute_reply": "2025-04-22T14:19:18.154025Z"
    },
    "papermill": {
     "duration": 13.530477,
     "end_time": "2025-04-22T14:19:18.156344",
     "exception": false,
     "start_time": "2025-04-22T14:19:04.625867",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting zh-core-web-sm==3.7.0\r\n",
      "  Downloading https://github.com/explosion/spacy-models/releases/download/zh_core_web_sm-3.7.0/zh_core_web_sm-3.7.0-py3-none-any.whl (48.5 MB)\r\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.5/48.5 MB\u001b[0m \u001b[31m36.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hRequirement already satisfied: spacy<3.8.0,>=3.7.0 in /usr/local/lib/python3.11/dist-packages (from zh-core-web-sm==3.7.0) (3.7.5)\r\n",
      "Collecting spacy-pkuseg<0.1.0,>=0.0.27 (from zh-core-web-sm==3.7.0)\r\n",
      "  Downloading spacy_pkuseg-0.0.33-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (13 kB)\r\n",
      "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.0.12)\r\n",
      "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.0.5)\r\n",
      "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.0.12)\r\n",
      "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.0.11)\r\n",
      "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.0.9)\r\n",
      "Requirement already satisfied: thinc<8.3.0,>=8.2.2 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (8.2.5)\r\n",
      "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.1.3)\r\n",
      "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.5.1)\r\n",
      "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.0.10)\r\n",
      "Requirement already satisfied: weasel<0.5.0,>=0.1.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.4.1)\r\n",
      "Requirement already satisfied: typer<1.0.0,>=0.3.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.15.1)\r\n",
      "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (4.67.1)\r\n",
      "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.32.3)\r\n",
      "Requirement already satisfied: pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.11.3)\r\n",
      "Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.1.6)\r\n",
      "Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (75.1.0)\r\n",
      "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (24.2)\r\n",
      "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.5.0)\r\n",
      "Requirement already satisfied: numpy>=1.19.0 in /usr/local/lib/python3.11/dist-packages (from spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.26.4)\r\n",
      "Requirement already satisfied: language-data>=1.2 in /usr/local/lib/python3.11/dist-packages (from langcodes<4.0.0,>=3.2.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.3.0)\r\n",
      "Requirement already satisfied: mkl_fft in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.3.8)\r\n",
      "Requirement already satisfied: mkl_random in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.2.4)\r\n",
      "Requirement already satisfied: mkl_umath in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.1.1)\r\n",
      "Requirement already satisfied: mkl in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2025.1.0)\r\n",
      "Requirement already satisfied: tbb4py in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2022.1.0)\r\n",
      "Requirement already satisfied: mkl-service in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.4.1)\r\n",
      "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.7.0)\r\n",
      "Requirement already satisfied: pydantic-core==2.33.1 in /usr/local/lib/python3.11/dist-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.33.1)\r\n",
      "Requirement already satisfied: typing-extensions>=4.12.2 in /usr/local/lib/python3.11/dist-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (4.13.1)\r\n",
      "Requirement already satisfied: typing-inspection>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.4.0)\r\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3.0.0,>=2.13.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.4.1)\r\n",
      "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3.0.0,>=2.13.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.10)\r\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3.0.0,>=2.13.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.3.0)\r\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3.0.0,>=2.13.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2025.1.31)\r\n",
      "Requirement already satisfied: blis<0.8.0,>=0.7.8 in /usr/local/lib/python3.11/dist-packages (from thinc<8.3.0,>=8.2.2->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.7.11)\r\n",
      "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /usr/local/lib/python3.11/dist-packages (from thinc<8.3.0,>=8.2.2->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.1.5)\r\n",
      "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (8.1.8)\r\n",
      "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.5.4)\r\n",
      "Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (14.0.0)\r\n",
      "Requirement already satisfied: cloudpathlib<1.0.0,>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from weasel<0.5.0,>=0.1.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.20.0)\r\n",
      "Requirement already satisfied: smart-open<8.0.0,>=5.2.1 in /usr/local/lib/python3.11/dist-packages (from weasel<0.5.0,>=0.1.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (7.1.0)\r\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.0.2)\r\n",
      "Requirement already satisfied: marisa-trie>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from language-data>=1.2->langcodes<4.0.0,>=3.2.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.2.1)\r\n",
      "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (3.0.0)\r\n",
      "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2.19.1)\r\n",
      "Requirement already satisfied: wrapt in /usr/local/lib/python3.11/dist-packages (from smart-open<8.0.0,>=5.2.1->weasel<0.5.0,>=0.1.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.17.2)\r\n",
      "Requirement already satisfied: intel-openmp<2026,>=2024 in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2024.2.0)\r\n",
      "Requirement already satisfied: tbb==2022.* in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2022.1.0)\r\n",
      "Requirement already satisfied: tcmlib==1.* in /usr/local/lib/python3.11/dist-packages (from tbb==2022.*->mkl->numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (1.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-rt in /usr/local/lib/python3.11/dist-packages (from mkl_umath->numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2024.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-ur==2024.2.0 in /usr/local/lib/python3.11/dist-packages (from intel-openmp<2026,>=2024->mkl->numpy>=1.19.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (2024.2.0)\r\n",
      "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0.0,>=0.3.0->spacy<3.8.0,>=3.7.0->zh-core-web-sm==3.7.0) (0.1.2)\r\n",
      "Downloading spacy_pkuseg-0.0.33-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m31.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hInstalling collected packages: spacy-pkuseg, zh-core-web-sm\r\n",
      "Successfully installed spacy-pkuseg-0.0.33 zh-core-web-sm-3.7.0\r\n",
      "\u001b[38;5;2m✔ Download and installation successful\u001b[0m\r\n",
      "You can now load the package via spacy.load('zh_core_web_sm')\r\n",
      "\u001b[38;5;3m⚠ Restart to reload dependencies\u001b[0m\r\n",
      "If you are in a Jupyter or Colab notebook, you may need to restart Python in\r\n",
      "order to load all the package's dependencies. You can do this by selecting the\r\n",
      "'Restart kernel' or 'Restart runtime' option.\r\n"
     ]
    }
   ],
   "source": [
    "!python -m spacy download zh_core_web_sm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "dc0bdc39",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:19:18.189410Z",
     "iopub.status.busy": "2025-04-22T14:19:18.189156Z",
     "iopub.status.idle": "2025-04-22T14:19:20.855351Z",
     "shell.execute_reply": "2025-04-22T14:19:20.854501Z"
    },
    "papermill": {
     "duration": 2.683931,
     "end_time": "2025-04-22T14:19:20.856573",
     "exception": false,
     "start_time": "2025-04-22T14:19:18.172642",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 4.6 依存句法分析 (选取代表性评论，限制长度) ---\n",
      "将选取长度在 (10, 20] 范围内的评论。\n",
      "\n",
      "尝试选取一条 '好评' (标签: 2) 评论...\n",
      "  > 已选取 '好评' 评论 (索引: 1602, 长度: 19)\n",
      "\n",
      "尝试选取一条 '中评' (标签: 1) 评论...\n",
      "  > 已选取 '中评' 评论 (索引: 6, 长度: 16)\n",
      "\n",
      "尝试选取一条 '差评' (标签: 0) 评论...\n",
      "  > 已选取 '差评' 评论 (索引: 55, 长度: 13)\n",
      "\n",
      "最终选取的用于依存分析的评论:\n",
      "1. [好评] (长度: 19) 非常好用功能又快不卡是一款不错的手机哈...\n",
      "2. [中评] (长度: 16) 打开网页好卡网咯不稳定其他的还行...\n",
      "3. [差评] (长度: 13) 经常卡机质量不行还不让退货...\n",
      "\n",
      "--- 开始进行依存句法分析 ---\n",
      "\n",
      "--- 分析 [好评] 评论 1 ---\n",
      "原文 (长度 19): '非常好用功能又快不卡是一款不错的手机哈'\n",
      "\n",
      "词语\t词性\t依存关系\t父节点\n",
      "----------------------------------------\n",
      "非常\tADV\tadvmod\t好用\n",
      "好用\tVERB\tdep\t手机\n",
      "功能\tNOUN\tdobj\t好用\n",
      "又\tADV\tadvmod\t快\n",
      "快\tVERB\tdep\t好用\n",
      "不\tADV\tneg\t卡\n",
      "卡\tVERB\tconj\t快\n",
      "是\tVERB\tcop\t手机\n",
      "一\tNUM\tnummod\t手机\n",
      "款\tNUM\tmark:clf\t一\n",
      "不错\tADJ\tamod\t手机\n",
      "的\tPART\tcase\t不错\n",
      "手机\tNOUN\tROOT\t手机\n",
      "哈\tPART\tdep\t手机\n",
      "----------------------------------------\n",
      "依存树已保存为 dependency_tree_好评_idx1602.svg\n",
      "在Jupyter Notebook中显示依存树:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<span class=\"tex2jax_ignore\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:lang=\"zh\" id=\"368a5890564f437a8041d9af03341b47-0\" class=\"displacy\" width=\"1310\" height=\"362.0\" direction=\"ltr\" style=\"max-width: none; height: 362.0px; color: #000000; background: #ffffff; font-family: Arial; direction: ltr\">\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"50\">非常</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"50\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"140\">好用</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"140\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"230\">功能</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"230\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"320\">又</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"320\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"410\">快</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"410\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"500\">不</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"500\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"590\">卡</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"590\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"680\">是</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"680\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"770\">一</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"770\">NUM</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"860\">款</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"860\">NUM</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"950\">不错</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"950\">ADJ</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"1040\">的</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"1040\">PART</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"1130\">手机</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"1130\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"272.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"1220\">哈</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"1220\">PART</tspan>\n",
       "</text>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-0\" stroke-width=\"2px\" d=\"M62,227.0 62,212.0 128.0,212.0 128.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-0\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">advmod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M62,229.0 L58,221.0 66,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-1\" stroke-width=\"2px\" d=\"M152,227.0 152,152.0 1130.0,152.0 1130.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-1\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M152,229.0 L148,221.0 156,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-2\" stroke-width=\"2px\" d=\"M152,227.0 152,212.0 218.0,212.0 218.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-2\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dobj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M218.0,229.0 L222.0,221.0 214.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-3\" stroke-width=\"2px\" d=\"M332,227.0 332,212.0 398.0,212.0 398.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-3\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">advmod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M332,229.0 L328,221.0 336,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-4\" stroke-width=\"2px\" d=\"M152,227.0 152,197.0 401.0,197.0 401.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-4\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M401.0,229.0 L405.0,221.0 397.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-5\" stroke-width=\"2px\" d=\"M512,227.0 512,212.0 578.0,212.0 578.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-5\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">neg</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M512,229.0 L508,221.0 516,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-6\" stroke-width=\"2px\" d=\"M422,227.0 422,197.0 581.0,197.0 581.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-6\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">conj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M581.0,229.0 L585.0,221.0 577.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-7\" stroke-width=\"2px\" d=\"M692,227.0 692,167.0 1127.0,167.0 1127.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-7\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">cop</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M692,229.0 L688,221.0 696,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-8\" stroke-width=\"2px\" d=\"M782,227.0 782,182.0 1124.0,182.0 1124.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-8\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">nummod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M782,229.0 L778,221.0 786,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-9\" stroke-width=\"2px\" d=\"M782,227.0 782,212.0 848.0,212.0 848.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-9\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">mark:clf</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M848.0,229.0 L852.0,221.0 844.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-10\" stroke-width=\"2px\" d=\"M962,227.0 962,197.0 1121.0,197.0 1121.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-10\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">amod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M962,229.0 L958,221.0 966,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-11\" stroke-width=\"2px\" d=\"M962,227.0 962,212.0 1028.0,212.0 1028.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-11\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">case</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M1028.0,229.0 L1032.0,221.0 1024.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-368a5890564f437a8041d9af03341b47-0-12\" stroke-width=\"2px\" d=\"M1142,227.0 1142,212.0 1208.0,212.0 1208.0,227.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-368a5890564f437a8041d9af03341b47-0-12\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M1208.0,229.0 L1212.0,221.0 1204.0,221.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "</svg></span>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------\n",
      "\n",
      "--- 分析 [中评] 评论 2 ---\n",
      "原文 (长度 16): '打开网页好卡网咯不稳定其他的还行'\n",
      "\n",
      "词语\t词性\t依存关系\t父节点\n",
      "----------------------------------------\n",
      "打开\tVERB\tdep\t稳定\n",
      "网页\tNOUN\tdobj\t打开\n",
      "好\tADV\tamod\t卡网\n",
      "卡网\tNOUN\tconj\t打开\n",
      "咯\tPART\tdep\t稳定\n",
      "不\tADV\tneg\t稳定\n",
      "稳定\tVERB\tROOT\t稳定\n",
      "其他\tDET\tdep\t行\n",
      "的\tPART\tcase\t其他\n",
      "还\tADV\tadvmod\t行\n",
      "行\tVERB\tconj\t稳定\n",
      "----------------------------------------\n",
      "依存树已保存为 dependency_tree_中评_idx6.svg\n",
      "在Jupyter Notebook中显示依存树:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<span class=\"tex2jax_ignore\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:lang=\"zh\" id=\"c1372f736be342fd986668633c3ac8f8-0\" class=\"displacy\" width=\"1040\" height=\"272.0\" direction=\"ltr\" style=\"max-width: none; height: 272.0px; color: #000000; background: #ffffff; font-family: Arial; direction: ltr\">\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"50\">打开</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"50\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"140\">网页</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"140\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"230\">好</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"230\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"320\">卡网</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"320\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"410\">咯</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"410\">PART</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"500\">不</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"500\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"590\">稳定</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"590\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"680\">其他</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"680\">DET</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"770\">的</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"770\">PART</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"860\">还</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"860\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"950\">行</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"950\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-0\" stroke-width=\"2px\" d=\"M62,137.0 62,92.0 590.0,92.0 590.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-0\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M62,139.0 L58,131.0 66,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-1\" stroke-width=\"2px\" d=\"M62,137.0 62,122.0 134.0,122.0 134.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-1\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dobj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M134.0,139.0 L138.0,131.0 130.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-2\" stroke-width=\"2px\" d=\"M242,137.0 242,122.0 314.0,122.0 314.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-2\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">amod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M242,139.0 L238,131.0 246,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-3\" stroke-width=\"2px\" d=\"M62,137.0 62,107.0 317.0,107.0 317.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-3\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">conj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M317.0,139.0 L321.0,131.0 313.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-4\" stroke-width=\"2px\" d=\"M422,137.0 422,107.0 587.0,107.0 587.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-4\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M422,139.0 L418,131.0 426,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-5\" stroke-width=\"2px\" d=\"M512,137.0 512,122.0 584.0,122.0 584.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-5\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">neg</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M512,139.0 L508,131.0 516,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-6\" stroke-width=\"2px\" d=\"M692,137.0 692,107.0 947.0,107.0 947.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-6\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M692,139.0 L688,131.0 696,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-7\" stroke-width=\"2px\" d=\"M692,137.0 692,122.0 764.0,122.0 764.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-7\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">case</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M764.0,139.0 L768.0,131.0 760.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-8\" stroke-width=\"2px\" d=\"M872,137.0 872,122.0 944.0,122.0 944.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-8\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">advmod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M872,139.0 L868,131.0 876,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-c1372f736be342fd986668633c3ac8f8-0-9\" stroke-width=\"2px\" d=\"M602,137.0 602,92.0 950.0,92.0 950.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-c1372f736be342fd986668633c3ac8f8-0-9\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">conj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M950.0,139.0 L954.0,131.0 946.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "</svg></span>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------\n",
      "\n",
      "--- 分析 [差评] 评论 3 ---\n",
      "原文 (长度 13): '经常卡机质量不行还不让退货'\n",
      "\n",
      "词语\t词性\t依存关系\t父节点\n",
      "----------------------------------------\n",
      "经常\tADV\tadvmod\t不行\n",
      "卡机\tNOUN\tcompound:nn\t质量\n",
      "质量\tNOUN\tnsubj\t不行\n",
      "不行\tVERB\tROOT\t不行\n",
      "还\tADV\tadvmod\t让\n",
      "不\tADV\tneg\t让\n",
      "让\tVERB\tconj\t不行\n",
      "退货\tNOUN\tdobj\t让\n",
      "----------------------------------------\n",
      "依存树已保存为 dependency_tree_差评_idx55.svg\n",
      "在Jupyter Notebook中显示依存树:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<span class=\"tex2jax_ignore\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:lang=\"zh\" id=\"b7efa7f0f5f4405a8a8cf7c4d289aca7-0\" class=\"displacy\" width=\"770\" height=\"272.0\" direction=\"ltr\" style=\"max-width: none; height: 272.0px; color: #000000; background: #ffffff; font-family: Arial; direction: ltr\">\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"50\">经常</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"50\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"140\">卡机</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"140\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"230\">质量</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"230\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"320\">不行</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"320\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"410\">还</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"410\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"500\">不</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"500\">ADV</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"590\">让</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"590\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"182.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"680\">退货</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"680\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-0\" stroke-width=\"2px\" d=\"M62,137.0 62,107.0 317.0,107.0 317.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-0\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">advmod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M62,139.0 L58,131.0 66,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-1\" stroke-width=\"2px\" d=\"M152,137.0 152,122.0 224.0,122.0 224.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-1\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">compound:nn</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M152,139.0 L148,131.0 156,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-2\" stroke-width=\"2px\" d=\"M242,137.0 242,122.0 314.0,122.0 314.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-2\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">nsubj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M242,139.0 L238,131.0 246,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-3\" stroke-width=\"2px\" d=\"M422,137.0 422,107.0 587.0,107.0 587.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-3\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">advmod</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M422,139.0 L418,131.0 426,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-4\" stroke-width=\"2px\" d=\"M512,137.0 512,122.0 584.0,122.0 584.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-4\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">neg</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M512,139.0 L508,131.0 516,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-5\" stroke-width=\"2px\" d=\"M332,137.0 332,92.0 590.0,92.0 590.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-5\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">conj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M590.0,139.0 L594.0,131.0 586.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-6\" stroke-width=\"2px\" d=\"M602,137.0 602,122.0 674.0,122.0 674.0,137.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-b7efa7f0f5f4405a8a8cf7c4d289aca7-0-6\" class=\"displacy-label\" startOffset=\"50%\" side=\"left\" fill=\"currentColor\" text-anchor=\"middle\">dobj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M674.0,139.0 L678.0,131.0 670.0,131.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "</svg></span>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import spacy\n",
    "from spacy import displacy\n",
    "import matplotlib.pyplot as plt # 虽然这里没直接用，但通常 spacy/displacy 会依赖\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# --- 4.6 句法分析 (使用 spaCy，选取代表性评论并限制长度) ---\n",
    "print(\"\\n--- 4.6 依存句法分析 (选取代表性评论，限制长度) ---\")\n",
    "\n",
    "# 定义文本长度阈值\n",
    "MIN_LENGTH = 10  # 最小长度\n",
    "MAX_LENGTH = 20 # 新增：最大长度限制 (你可以调整这个值)\n",
    "print(f\"将选取长度在 ({MIN_LENGTH}, {MAX_LENGTH}] 范围内的评论。\")\n",
    "\n",
    "# 存储选取的样本评论\n",
    "sample_reviews_list = []\n",
    "selected_indices = [] # 记录选取的索引\n",
    "\n",
    "# 标签字典\n",
    "label_map = {2: '好评', 1: '中评', 0: '差评'}\n",
    "\n",
    "# 依次选取好评、中评、差评\n",
    "for label_value, label_name in label_map.items():\n",
    "    print(f\"\\n尝试选取一条 '{label_name}' (标签: {label_value}) 评论...\")\n",
    "    # 筛选出对应标签且满足长度范围要求的评论\n",
    "    filtered_df = df[\n",
    "        (df['标签'] == label_value) &\n",
    "        (df['清洗后内容'].str.len() > MIN_LENGTH) &\n",
    "        (df['清洗后内容'].str.len() <= MAX_LENGTH)\n",
    "    ].copy() # 使用 .copy() 避免 SettingWithCopyWarning\n",
    "\n",
    "    selected_review = None\n",
    "    selected_idx = -1\n",
    "\n",
    "    if not filtered_df.empty:\n",
    "        # 如果找到满足条件的，随机选择一条或选择第一条\n",
    "        # 这里我们还是选择第一条，保持简单\n",
    "        selected_review = filtered_df['清洗后内容'].iloc[0]\n",
    "        selected_idx = filtered_df.index[0]\n",
    "        print(f\"  > 已选取 '{label_name}' 评论 (索引: {selected_idx}, 长度: {len(selected_review)})\")\n",
    "        # 添加到列表\n",
    "        sample_reviews_list.append(selected_review)\n",
    "        selected_indices.append(selected_idx)\n",
    "    else:\n",
    "        # 如果没有找到满足条件的评论\n",
    "        print(f\"  > 未能在长度范围 ({MIN_LENGTH}, {MAX_LENGTH}] 内找到合适的 '{label_name}' 评论。\")\n",
    "\n",
    "\n",
    "# 现在 sample_reviews_list 中包含了选取的评论文本\n",
    "print(\"\\n最终选取的用于依存分析的评论:\")\n",
    "if sample_reviews_list:\n",
    "    for i, review in enumerate(sample_reviews_list):\n",
    "        original_label = label_map[df.loc[selected_indices[i], '标签']]\n",
    "        print(f\"{i+1}. [{original_label}] (长度: {len(review)}) {review[:80]}...\") # 打印部分内容和长度\n",
    "else:\n",
    "    print(\"未能选取到任何符合长度要求的评论进行分析。\")\n",
    "\n",
    "\n",
    "# --- 接续原来的依存分析代码 ---\n",
    "# 加载 spaCy 中文模型\n",
    "try:\n",
    "    nlp = spacy.load(\"zh_core_web_sm\")\n",
    "except OSError:\n",
    "    print(\"\\n错误: spaCy中文模型 'zh_core_web_sm' 未找到。\")\n",
    "    print(\"请运行: python -m spacy download zh_core_web_sm\")\n",
    "    nlp = None\n",
    "\n",
    "if nlp and sample_reviews_list: # 确保模型已加载且列表不为空\n",
    "    print(\"\\n--- 开始进行依存句法分析 ---\")\n",
    "    for i, review in enumerate(sample_reviews_list):\n",
    "        original_label = label_map[df.loc[selected_indices[i], '标签']]\n",
    "        print(f\"\\n--- 分析 [{original_label}] 评论 {i+1} ---\")\n",
    "        print(f\"原文 (长度 {len(review)}): '{review}'\")\n",
    "        doc = nlp(review)\n",
    "\n",
    "        # 打印词语、词性、依存关系\n",
    "        print(\"\\n词语\\t词性\\t依存关系\\t父节点\")\n",
    "        print(\"-\" * 40)\n",
    "        for token in doc:\n",
    "            if not token.is_punct and not token.is_space:\n",
    "                 print(f\"{token.text}\\t{token.pos_}\\t{token.dep_}\\t{token.head.text}\")\n",
    "        print(\"-\" * 40)\n",
    "\n",
    "        # 可视化依存树 (在Jupyter环境或保存为SVG)\n",
    "        svg = displacy.render(doc, style=\"dep\", jupyter=False, options={'compact': True, 'distance': 90})\n",
    "        # 使用更明确的文件名\n",
    "        filename = f\"dependency_tree_{original_label}_idx{selected_indices[i]}.svg\"\n",
    "        try:\n",
    "            with open(filename, \"w\", encoding=\"utf-8\") as f:\n",
    "                f.write(svg)\n",
    "            print(f\"依存树已保存为 {filename}\")\n",
    "        except Exception as e:\n",
    "            print(f\"保存依存树SVG时出错: {e}\")\n",
    "\n",
    "\n",
    "        # 在Jupyter环境中直接显示 (如果需要)\n",
    "        print(\"在Jupyter Notebook中显示依存树:\")\n",
    "        displacy.render(doc, style=\"dep\", jupyter=True, options={'compact': True, 'distance': 90})\n",
    "        print(\"-\" * 20)\n",
    "\n",
    "\n",
    "else:\n",
    "    if not nlp:\n",
    "        print(\"\\nspaCy 模型未加载，跳过依存分析。\")\n",
    "    if not sample_reviews_list:\n",
    "        print(\"\\n未能选取到符合条件的评论样本，跳过依存分析。\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7a9c7b4a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:19:20.891308Z",
     "iopub.status.busy": "2025-04-22T14:19:20.890339Z",
     "iopub.status.idle": "2025-04-22T14:19:21.724584Z",
     "shell.execute_reply": "2025-04-22T14:19:21.723811Z"
    },
    "papermill": {
     "duration": 0.853135,
     "end_time": "2025-04-22T14:19:21.726404",
     "exception": false,
     "start_time": "2025-04-22T14:19:20.873269",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "训练过程曲线图已保存为 training_history.png\n"
     ]
    },
    {
     "data": {
      "image/png": "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TIyZiEgpVko3gIjImBwcHJCZmSk/V6lUCraGiIiIyDwxZiIiJTApRUTNmkqlgpOTk9LNICIiIjJrjJmISAmcvkdELc6SJUsQEhKCgQMHwtHRERMnTkRJSYn8+qlTp+Dv7w9nZ2dMnjwZRUVF8mvHjh1D7969YW9vj5CQEOTk5NQ69qZNm+Dm5gY3Nzfs3r3bVB+JiIiI6LljzERExsakFBE1a8XFxXBycpIfc+fOBQD88MMPmD59Oi5duoSMjAx88sknAIDs7GyMGDEC8+bNQ0pKCsrKyhAREQEA0Gg0CAsLw7vvvoubN2/CwcEB8+fPl9/r+vXr2L17N86cOYNp06bh3XffNfXHJSIiIvq3MGYiIiWoJEmSlG4EEZExJCUlITw8HNeuXZO3tWnTBuvWrcPRo0eRnJwMANizZw/+/Oc/IyMjA8uXL8eJEydw+PBhAEBubi48PDxw9+5dbN26FSdPnsShQ4cAADk5Obh69SpCQ0MRHx+POXPmIDMzE66urkhNTUWPHj3AWywRERGZO8ZMRKQU1pQiombNwsICXbp0qbPd09NT/rlTp07Iz88HIL718/HxqfWara0tsrKy6rzm4eEBDw8P+bmfnx9cXV0BADY2Ns/7oxAREREZDWMmIlICp+8RUYuUkZEh/5ydnQ13d3cAgJeXF9LT0+XX8vLyoNVq0blzZ3h6etbaLzU1FQEBATAYDADEqjVEREREzQljJiIyJialiKhZkyQJRUVFtR56vR7nz5/H3//+d9y5cwcrV67E2LFjAQBTpkzB2bNnsWnTJmg0GsyZMwejRo2Cm5sbJk2ahFOnTiE+Ph7Z2dmIioqCq6srLCx4KyUiIqKmjTETESmBdwUiatZKSkrg7Oxc63Hx4kWEhYVh8+bN6NOnD7p27YrFixcDEEPUDx48iLi4OAQEBECtVmPbtm0AAG9vb+zduxdr1qxBr169UFRUJL9GRERE1JQxZiIiJbDQORG1OEuWLEFGRgbi4+OVbgoRERGR2WLMRETGxpFSRERERERERERkchwpRUREREREREREJseRUkREREREREREZHJMShERERERERERkckxKUVERERERERERCbHpBQREREREREREZkck1JERERERERERGRyTEoREREREREREZHJMSlFREREREREREQmx6QUERERERERERGZ3P8Hz3WSVq/uSw8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 5))\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(history['train_acc'], label='训练集准确率')\n",
    "plt.plot(history['val_acc'], label='验证集准确率')\n",
    "plt.title('模型准确率')\n",
    "plt.ylabel('准确率')\n",
    "plt.xlabel('Epoch')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(history['train_loss'], label='训练集损失')\n",
    "plt.plot(history['val_loss'], label='验证集损失')\n",
    "plt.title('模型损失')\n",
    "plt.ylabel('损失')\n",
    "plt.xlabel('Epoch')\n",
    "plt.legend()\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.savefig('training_history.png') # 保存图像\n",
    "print(\"\\n训练过程曲线图已保存为 training_history.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "17efd500",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:19:21.763980Z",
     "iopub.status.busy": "2025-04-22T14:19:21.763734Z",
     "iopub.status.idle": "2025-04-22T14:20:33.315804Z",
     "shell.execute_reply": "2025-04-22T14:20:33.315086Z"
    },
    "papermill": {
     "duration": 71.5719,
     "end_time": "2025-04-22T14:20:33.317235",
     "exception": false,
     "start_time": "2025-04-22T14:19:21.745335",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting bertviz\r\n",
      "  Downloading bertviz-1.4.0-py3-none-any.whl.metadata (19 kB)\r\n",
      "Requirement already satisfied: transformers>=2.0 in /usr/local/lib/python3.11/dist-packages (from bertviz) (4.51.1)\r\n",
      "Requirement already satisfied: torch>=1.0 in /usr/local/lib/python3.11/dist-packages (from bertviz) (2.5.1+cu124)\r\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.11/dist-packages (from bertviz) (4.67.1)\r\n",
      "Requirement already satisfied: boto3 in /usr/local/lib/python3.11/dist-packages (from bertviz) (1.37.29)\r\n",
      "Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from bertviz) (2.32.3)\r\n",
      "Requirement already satisfied: regex in /usr/local/lib/python3.11/dist-packages (from bertviz) (2024.11.6)\r\n",
      "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.11/dist-packages (from bertviz) (0.2.0)\r\n",
      "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (3.18.0)\r\n",
      "Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (4.13.1)\r\n",
      "Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (3.4.2)\r\n",
      "Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (3.1.6)\r\n",
      "Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (2025.3.2)\r\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (12.4.127)\r\n",
      "Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\r\n",
      "Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\r\n",
      "Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\r\n",
      "Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\r\n",
      "Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\r\n",
      "Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\r\n",
      "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (2.21.5)\r\n",
      "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (12.4.127)\r\n",
      "Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=1.0->bertviz)\r\n",
      "  Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\r\n",
      "Requirement already satisfied: triton==3.1.0 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (3.1.0)\r\n",
      "Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch>=1.0->bertviz) (1.13.1)\r\n",
      "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy==1.13.1->torch>=1.0->bertviz) (1.3.0)\r\n",
      "Requirement already satisfied: huggingface-hub<1.0,>=0.30.0 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (0.30.2)\r\n",
      "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (1.26.4)\r\n",
      "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (24.2)\r\n",
      "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (6.0.2)\r\n",
      "Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (0.21.0)\r\n",
      "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from transformers>=2.0->bertviz) (0.5.2)\r\n",
      "Requirement already satisfied: botocore<1.38.0,>=1.37.29 in /usr/local/lib/python3.11/dist-packages (from boto3->bertviz) (1.37.29)\r\n",
      "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from boto3->bertviz) (1.0.1)\r\n",
      "Requirement already satisfied: s3transfer<0.12.0,>=0.11.0 in /usr/local/lib/python3.11/dist-packages (from boto3->bertviz) (0.11.4)\r\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->bertviz) (3.4.1)\r\n",
      "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->bertviz) (3.10)\r\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->bertviz) (2.3.0)\r\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->bertviz) (2025.1.31)\r\n",
      "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.11/dist-packages (from botocore<1.38.0,>=1.37.29->boto3->bertviz) (2.9.0.post0)\r\n",
      "Requirement already satisfied: mkl_fft in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (1.3.8)\r\n",
      "Requirement already satisfied: mkl_random in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (1.2.4)\r\n",
      "Requirement already satisfied: mkl_umath in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (0.1.1)\r\n",
      "Requirement already satisfied: mkl in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (2025.1.0)\r\n",
      "Requirement already satisfied: tbb4py in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (2022.1.0)\r\n",
      "Requirement already satisfied: mkl-service in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=2.0->bertviz) (2.4.1)\r\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch>=1.0->bertviz) (3.0.2)\r\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.38.0,>=1.37.29->boto3->bertviz) (1.17.0)\r\n",
      "Requirement already satisfied: intel-openmp<2026,>=2024 in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers>=2.0->bertviz) (2024.2.0)\r\n",
      "Requirement already satisfied: tbb==2022.* in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers>=2.0->bertviz) (2022.1.0)\r\n",
      "Requirement already satisfied: tcmlib==1.* in /usr/local/lib/python3.11/dist-packages (from tbb==2022.*->mkl->numpy>=1.17->transformers>=2.0->bertviz) (1.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-rt in /usr/local/lib/python3.11/dist-packages (from mkl_umath->numpy>=1.17->transformers>=2.0->bertviz) (2024.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-ur==2024.2.0 in /usr/local/lib/python3.11/dist-packages (from intel-openmp<2026,>=2024->mkl->numpy>=1.17->transformers>=2.0->bertviz) (2024.2.0)\r\n",
      "Downloading bertviz-1.4.0-py3-none-any.whl (157 kB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m157.6/157.6 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m1.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m30.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m13.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m8.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m59.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hInstalling collected packages: nvidia-nvjitlink-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cublas-cu12, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nvidia-cusolver-cu12, bertviz\r\n",
      "  Attempting uninstall: nvidia-nvjitlink-cu12\r\n",
      "    Found existing installation: nvidia-nvjitlink-cu12 12.8.93\r\n",
      "    Uninstalling nvidia-nvjitlink-cu12-12.8.93:\r\n",
      "      Successfully uninstalled nvidia-nvjitlink-cu12-12.8.93\r\n",
      "  Attempting uninstall: nvidia-curand-cu12\r\n",
      "    Found existing installation: nvidia-curand-cu12 10.3.9.90\r\n",
      "    Uninstalling nvidia-curand-cu12-10.3.9.90:\r\n",
      "      Successfully uninstalled nvidia-curand-cu12-10.3.9.90\r\n",
      "  Attempting uninstall: nvidia-cufft-cu12\r\n",
      "    Found existing installation: nvidia-cufft-cu12 11.3.3.83\r\n",
      "    Uninstalling nvidia-cufft-cu12-11.3.3.83:\r\n",
      "      Successfully uninstalled nvidia-cufft-cu12-11.3.3.83\r\n",
      "  Attempting uninstall: nvidia-cublas-cu12\r\n",
      "    Found existing installation: nvidia-cublas-cu12 12.8.4.1\r\n",
      "    Uninstalling nvidia-cublas-cu12-12.8.4.1:\r\n",
      "      Successfully uninstalled nvidia-cublas-cu12-12.8.4.1\r\n",
      "  Attempting uninstall: nvidia-cusparse-cu12\r\n",
      "    Found existing installation: nvidia-cusparse-cu12 12.5.8.93\r\n",
      "    Uninstalling nvidia-cusparse-cu12-12.5.8.93:\r\n",
      "      Successfully uninstalled nvidia-cusparse-cu12-12.5.8.93\r\n",
      "  Attempting uninstall: nvidia-cudnn-cu12\r\n",
      "    Found existing installation: nvidia-cudnn-cu12 9.3.0.75\r\n",
      "    Uninstalling nvidia-cudnn-cu12-9.3.0.75:\r\n",
      "      Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75\r\n",
      "  Attempting uninstall: nvidia-cusolver-cu12\r\n",
      "    Found existing installation: nvidia-cusolver-cu12 11.7.3.90\r\n",
      "    Uninstalling nvidia-cusolver-cu12-11.7.3.90:\r\n",
      "      Successfully uninstalled nvidia-cusolver-cu12-11.7.3.90\r\n",
      "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\r\n",
      "pylibcugraph-cu12 24.12.0 requires pylibraft-cu12==24.12.*, but you have pylibraft-cu12 25.2.0 which is incompatible.\r\n",
      "pylibcugraph-cu12 24.12.0 requires rmm-cu12==24.12.*, but you have rmm-cu12 25.2.0 which is incompatible.\u001b[0m\u001b[31m\r\n",
      "\u001b[0mSuccessfully installed bertviz-1.4.0 nvidia-cublas-cu12-12.4.5.8 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-nvjitlink-cu12-12.4.127\r\n"
     ]
    }
   ],
   "source": [
    "!pip install bertviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ff13b2f8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:33.396189Z",
     "iopub.status.busy": "2025-04-22T14:20:33.395387Z",
     "iopub.status.idle": "2025-04-22T14:20:35.450004Z",
     "shell.execute_reply": "2025-04-22T14:20:35.449126Z"
    },
    "papermill": {
     "duration": 2.094895,
     "end_time": "2025-04-22T14:20:35.451241",
     "exception": false,
     "start_time": "2025-04-22T14:20:33.356346",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "正在保存训练好的 SentimentClassifier 模型权重到: ./saved_models/sentiment_classifier_final.bin\n",
      "模型权重保存成功。\n",
      "\n",
      "创建用于可视化的 SentimentClassifierWithAttn 模型实例...\n",
      "模型实例已创建。\n",
      "尝试从 ./saved_models/sentiment_classifier_final.bin 加载权重...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_18/1201188904.py:53: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  model_for_viz.load_state_dict(torch.load(MODEL_SAVE_PATH, map_location=device))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "成功加载已训练模型的权重！\n",
      "模型已移至设备 cuda 并设置为评估模式。\n",
      "Tokenizer 已加载。\n",
      "\n",
      "使用样本评论进行可视化: '非常好用功能又快不卡是一款不错的手机哈'\n",
      "输入数据已准备好。\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "MODEL_SAVE_DIR = \"./saved_models\"\n",
    "if not os.path.exists(MODEL_SAVE_DIR):\n",
    "    os.makedirs(MODEL_SAVE_DIR)\n",
    "MODEL_SAVE_PATH = os.path.join(MODEL_SAVE_DIR, \"sentiment_classifier_final.bin\")\n",
    "\n",
    "# --- 1. 保存训练好的 SentimentClassifier 模型权重 ---\n",
    "# 假设你训练好的模型实例叫做 'model'\n",
    "# 确保 model 是 SentimentClassifier 类的实例，并且训练已完成\n",
    "print(f\"\\n正在保存训练好的 SentimentClassifier 模型权重到: {MODEL_SAVE_PATH}\")\n",
    "# 确保 model 在正确的设备上 (虽然保存时通常不强制要求，但好习惯)\n",
    "# model.to(device)\n",
    "# model.eval() # 如果模型还在训练模式，最好切换到评估模式再保存\n",
    "\n",
    "# **执行保存操作**\n",
    "# 你需要将下面这行取消注释，并确保 'model' 是你训练好的 SentimentClassifier 实例\n",
    "torch.save(model.state_dict(), MODEL_SAVE_PATH)\n",
    "print(\"模型权重保存成功。\")\n",
    "\n",
    "# --- 2. 定义新的 SentimentClassifierWithAttn 类 ---\n",
    "#    (这个类与上一个回答中的相同，确保它配置了输出注意力)\n",
    "class SentimentClassifierWithAttn(nn.Module):\n",
    "    def __init__(self, n_classes, model_name=PRETRAINED_MODEL_NAME):\n",
    "        super(SentimentClassifierWithAttn, self).__init__()\n",
    "        self.bert = BertModel.from_pretrained(model_name, output_attentions=True) # 核心：配置输出注意力\n",
    "        self.drop = nn.Dropout(p=0.3)\n",
    "        self.out = nn.Linear(self.bert.config.hidden_size, n_classes)\n",
    "\n",
    "    def forward(self, input_ids, attention_mask, output_attentions=True):\n",
    "        outputs = self.bert(\n",
    "            input_ids=input_ids,\n",
    "            attention_mask=attention_mask,\n",
    "            output_attentions=output_attentions\n",
    "        )\n",
    "        pooled_output = outputs.pooler_output\n",
    "        drop_output = self.drop(pooled_output)\n",
    "        logits = self.out(drop_output)\n",
    "\n",
    "        if output_attentions:\n",
    "            return logits, outputs.attentions\n",
    "        else:\n",
    "            return logits\n",
    "\n",
    "# --- 3. 创建 SentimentClassifierWithAttn 的新实例 ---\n",
    "print(\"\\n创建用于可视化的 SentimentClassifierWithAttn 模型实例...\")\n",
    "model_for_viz = SentimentClassifierWithAttn(n_classes=N_CLASSES, model_name=PRETRAINED_MODEL_NAME)\n",
    "print(\"模型实例已创建。\")\n",
    "\n",
    "# --- 4. 加载保存的权重到新实例中 ---\n",
    "print(f\"尝试从 {MODEL_SAVE_PATH} 加载权重...\")\n",
    "try:\n",
    "    # 加载状态字典，并确保映射到正确的设备\n",
    "    model_for_viz.load_state_dict(torch.load(MODEL_SAVE_PATH, map_location=device))\n",
    "    print(\"成功加载已训练模型的权重！\")\n",
    "except FileNotFoundError:\n",
    "    print(f\"警告：未找到模型权重文件 '{MODEL_SAVE_PATH}'。\")\n",
    "    print(\"可视化将使用 BERT 预训练权重，分类层是随机初始化的。\")\n",
    "except Exception as e:\n",
    "    print(f\"加载权重时发生错误: {e}\")\n",
    "    print(\"可视化将使用 BERT 预训练权重，分类层是随机初始化的。\")\n",
    "\n",
    "\n",
    "# --- 5. 将模型移到设备并设置为评估模式 ---\n",
    "model_for_viz.to(device)\n",
    "model_for_viz.eval() # 非常重要！确保模型处于评估模式\n",
    "print(f\"模型已移至设备 {device} 并设置为评估模式。\")\n",
    "\n",
    "\n",
    "# --- 6. 加载 Tokenizer (与之前相同) ---\n",
    "tokenizer = BertTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)\n",
    "print(\"Tokenizer 已加载。\")\n",
    "\n",
    "# --- 7. 准备输入数据 (与之前相同) ---\n",
    "if 'sample_reviews_list' in locals() and sample_reviews_list:\n",
    "     sample_text = sample_reviews_list[0] # 假设这是好评\n",
    "     print(f\"\\n使用样本评论进行可视化: '{sample_text}'\")\n",
    "else:\n",
    "     sample_text = \"这手机用起来感觉还不错，电池挺耐用的。\" # 备用样本\n",
    "     print(f\"\\n使用备用样本评论进行可视化: '{sample_text}'\")\n",
    "\n",
    "inputs = tokenizer.encode_plus(\n",
    "    sample_text, add_special_tokens=True, max_length=128,\n",
    "    padding='max_length', truncation=True, return_tensors='pt',\n",
    "    return_attention_mask=True\n",
    ")\n",
    "input_ids = inputs['input_ids'].to(device)\n",
    "attention_mask = inputs['attention_mask'].to(device)\n",
    "print(\"输入数据已准备好。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "3ac6e2ca",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:35.532175Z",
     "iopub.status.busy": "2025-04-22T14:20:35.531909Z",
     "iopub.status.idle": "2025-04-22T14:20:35.561108Z",
     "shell.execute_reply": "2025-04-22T14:20:35.560226Z"
    },
    "papermill": {
     "duration": 0.070522,
     "end_time": "2025-04-22T14:20:35.562326",
     "exception": false,
     "start_time": "2025-04-22T14:20:35.491804",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "BertSdpaSelfAttention is used but `torch.nn.functional.scaled_dot_product_attention` does not support non-absolute `position_embedding_type` or `output_attentions=True` or `head_mask`. Falling back to the manual attention implementation, but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation=\"eager\"` when loading the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 步骤 8：运行模型并准备可视化数据 ---\n",
      "模型推理完成，获得 attentions 元组。\n",
      "Attention 张量已移至 CPU，第一层形状: torch.Size([1, 12, 128, 128])\n",
      "获取的 Tokens (长度 128，包含特殊符和 padding): ['[CLS]', '非', '常', '好', '用', '功', '能', '又', '快', '不', '卡', '是', '一', '款', '不', '错', '的', '手', '机', '哈', '[SEP]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n--- 步骤 8：运行模型并准备可视化数据 ---\")\n",
    "with torch.no_grad():\n",
    "    logits, attentions = model_for_viz(input_ids=input_ids, attention_mask=attention_mask)\n",
    "print(\"模型推理完成，获得 attentions 元组。\")\n",
    "\n",
    "# **修改点 1**: 将 attentions 移到 CPU，但保持 4D 结构 (batch_size, num_heads, seq_len, seq_len)\n",
    "attentions_for_viz = tuple(attn.cpu() for attn in attentions)\n",
    "print(f\"Attention 张量已移至 CPU，第一层形状: {attentions_for_viz[0].shape}\") # 应为 (1, num_heads, max_len, max_len)\n",
    "\n",
    "# **修改点 2**: 获取包含 padding 的完整 token 列表\n",
    "tokens = tokenizer.convert_ids_to_tokens(input_ids.squeeze(0).tolist()) # 使用完整的 input_ids\n",
    "print(f\"获取的 Tokens (长度 {len(tokens)}，包含特殊符和 padding): {tokens}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c0500573",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:35.643896Z",
     "iopub.status.busy": "2025-04-22T14:20:35.643662Z",
     "iopub.status.idle": "2025-04-22T14:20:37.322671Z",
     "shell.execute_reply": "2025-04-22T14:20:37.321740Z"
    },
    "papermill": {
     "duration": 1.721521,
     "end_time": "2025-04-22T14:20:37.323947",
     "exception": false,
     "start_time": "2025-04-22T14:20:35.602426",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 步骤 9：使用 bertviz 可视化 ---\n",
      "正在生成注意力头视图 (Head View)...\n",
      "注意力头视图已保存到 attention_head_view.html\n",
      "请在浏览器中打开该文件查看。\n"
     ]
    }
   ],
   "source": [
    "from bertviz import head_view\n",
    "\n",
    "# --- 9. 使用 bertviz 可视化 (修正关键字参数) ---\n",
    "print(\"\\n--- 步骤 9：使用 bertviz 可视化 ---\")\n",
    "print(\"正在生成注意力头视图 (Head View)...\")\n",
    "try:\n",
    "    # **修改点**: 将 'tokens=tokens' 改为 'encoder_tokens=tokens'\n",
    "    html_output = head_view(\n",
    "        encoder_attention=attentions_for_viz,\n",
    "        encoder_tokens=tokens, # <-- 使用这个关键字参数\n",
    "        html_action='return'\n",
    "    )\n",
    "\n",
    "    # (可选) 保存 HTML\n",
    "    with open(\"attention_head_view.html\", \"w\", encoding='utf-8') as f:\n",
    "        f.write(html_output.data)\n",
    "    print(\"注意力头视图已保存到 attention_head_view.html\")\n",
    "    print(\"请在浏览器中打开该文件查看。\")\n",
    "\n",
    "# (可选) Fallback 逻辑也应该检查 encoder_tokens\n",
    "except TypeError as e:\n",
    "    # 如果 encoder_attention 或 encoder_tokens 是无效参数 (可能 bertviz 版本旧?)\n",
    "    if \"'encoder_attention' is an invalid keyword argument\" in str(e) or \\\n",
    "       \"'encoder_tokens' is an invalid keyword argument\" in str(e):\n",
    "         print(\"尝试不使用 'encoder_*' 关键字参数调用 head_view...\")\n",
    "         try:\n",
    "             # 尝试最简单的调用方式\n",
    "             html_output = head_view(attentions_for_viz, tokens, html_action='return')\n",
    "             with open(\"attention_head_view.html\", \"w\", encoding='utf-8') as f:\n",
    "                f.write(html_output.data)\n",
    "             print(\"注意力头视图已保存到 attention_head_view.html (重试成功)\")\n",
    "         except Exception as inner_e:\n",
    "             print(f\"Fallback 调用 head_view 时也出错: {inner_e}\")\n",
    "    else:\n",
    "         print(f\"调用 head_view 时发生未预料的 TypeError: {e}\")\n",
    "except ValueError as ve:\n",
    "     # 捕获其他可能的 ValueError\n",
    "     print(f\"调用 head_view 时发生 ValueError: {ve}\")\n",
    "     print(\"请再次检查传入的数据类型和 bertviz 的要求。\")\n",
    "except Exception as e:\n",
    "    print(f\"生成或保存可视化时发生错误: {e}\")\n",
    "    print(\"请检查 bertviz 版本和用法。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "041b3aa1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:37.403161Z",
     "iopub.status.busy": "2025-04-22T14:20:37.402926Z",
     "iopub.status.idle": "2025-04-22T14:20:44.596257Z",
     "shell.execute_reply": "2025-04-22T14:20:44.595317Z"
    },
    "papermill": {
     "duration": 7.234989,
     "end_time": "2025-04-22T14:20:44.597894",
     "exception": false,
     "start_time": "2025-04-22T14:20:37.362905",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting ltp\r\n",
      "  Downloading ltp-4.2.14-py3-none-any.whl.metadata (13 kB)\r\n",
      "Collecting ltp-core>=0.1.3 (from ltp)\r\n",
      "  Downloading ltp_core-0.1.4-py3-none-any.whl.metadata (2.7 kB)\r\n",
      "Collecting ltp-extension>=0.1.9 (from ltp)\r\n",
      "  Downloading ltp_extension-0.1.13-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.9 kB)\r\n",
      "Requirement already satisfied: huggingface-hub>=0.8.0 in /usr/local/lib/python3.11/dist-packages (from ltp) (0.30.2)\r\n",
      "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (3.18.0)\r\n",
      "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (2025.3.2)\r\n",
      "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (24.2)\r\n",
      "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (6.0.2)\r\n",
      "Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (2.32.3)\r\n",
      "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (4.67.1)\r\n",
      "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.8.0->ltp) (4.13.1)\r\n",
      "\u001b[33mWARNING: Package 'ltp-core' has an invalid Requires-Python: Invalid specifier: '>=3.6.*'\u001b[0m\u001b[33m\r\n",
      "\u001b[0mRequirement already satisfied: torch>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from ltp-core>=0.1.3->ltp) (2.5.1+cu124)\r\n",
      "Requirement already satisfied: transformers>=4.0.0 in /usr/local/lib/python3.11/dist-packages (from ltp-core>=0.1.3->ltp) (4.51.1)\r\n",
      "Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (3.4.2)\r\n",
      "Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (3.1.6)\r\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (9.1.0.70)\r\n",
      "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.5.8)\r\n",
      "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (11.2.1.3)\r\n",
      "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (10.3.5.147)\r\n",
      "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (11.6.1.9)\r\n",
      "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.3.1.170)\r\n",
      "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (2.21.5)\r\n",
      "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.127)\r\n",
      "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (12.4.127)\r\n",
      "Requirement already satisfied: triton==3.1.0 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (3.1.0)\r\n",
      "Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch>=1.6.0->ltp-core>=0.1.3->ltp) (1.13.1)\r\n",
      "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy==1.13.1->torch>=1.6.0->ltp-core>=0.1.3->ltp) (1.3.0)\r\n",
      "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.11/dist-packages (from transformers>=4.0.0->ltp-core>=0.1.3->ltp) (1.26.4)\r\n",
      "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.11/dist-packages (from transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2024.11.6)\r\n",
      "Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.11/dist-packages (from transformers>=4.0.0->ltp-core>=0.1.3->ltp) (0.21.0)\r\n",
      "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from transformers>=4.0.0->ltp-core>=0.1.3->ltp) (0.5.2)\r\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.8.0->ltp) (3.4.1)\r\n",
      "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.8.0->ltp) (3.10)\r\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.8.0->ltp) (2.3.0)\r\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.8.0->ltp) (2025.1.31)\r\n",
      "Requirement already satisfied: mkl_fft in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (1.3.8)\r\n",
      "Requirement already satisfied: mkl_random in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (1.2.4)\r\n",
      "Requirement already satisfied: mkl_umath in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (0.1.1)\r\n",
      "Requirement already satisfied: mkl in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2025.1.0)\r\n",
      "Requirement already satisfied: tbb4py in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2022.1.0)\r\n",
      "Requirement already satisfied: mkl-service in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2.4.1)\r\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch>=1.6.0->ltp-core>=0.1.3->ltp) (3.0.2)\r\n",
      "Requirement already satisfied: intel-openmp<2026,>=2024 in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2024.2.0)\r\n",
      "Requirement already satisfied: tbb==2022.* in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2022.1.0)\r\n",
      "Requirement already satisfied: tcmlib==1.* in /usr/local/lib/python3.11/dist-packages (from tbb==2022.*->mkl->numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (1.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-rt in /usr/local/lib/python3.11/dist-packages (from mkl_umath->numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2024.2.0)\r\n",
      "Requirement already satisfied: intel-cmplr-lib-ur==2024.2.0 in /usr/local/lib/python3.11/dist-packages (from intel-openmp<2026,>=2024->mkl->numpy>=1.17->transformers>=4.0.0->ltp-core>=0.1.3->ltp) (2024.2.0)\r\n",
      "Downloading ltp-4.2.14-py3-none-any.whl (20 kB)\r\n",
      "Downloading ltp_core-0.1.4-py3-none-any.whl (66 kB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.5/66.5 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hDownloading ltp_extension-0.1.13-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB)\r\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m23.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\r\n",
      "\u001b[?25hInstalling collected packages: ltp-extension, ltp-core, ltp\r\n",
      "Successfully installed ltp-4.2.14 ltp-core-0.1.4 ltp-extension-0.1.13\r\n"
     ]
    }
   ],
   "source": [
    "!pip install ltp --upgrade"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "47b418cd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:44.676387Z",
     "iopub.status.busy": "2025-04-22T14:20:44.675849Z",
     "iopub.status.idle": "2025-04-22T14:20:54.459758Z",
     "shell.execute_reply": "2025-04-22T14:20:54.458859Z"
    },
    "papermill": {
     "duration": 9.824604,
     "end_time": "2025-04-22T14:20:54.461023",
     "exception": false,
     "start_time": "2025-04-22T14:20:44.636419",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- 步骤 6: 使用 LTP 进行语义角色标注 (SRL) ---\n",
      "将使用设备: cuda\n",
      "正在加载 LTP 模型...\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "93eef33e41544cf2b21f337f9457662c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "config.json:   0%|          | 0.00/9.29k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b73d9ce733d44ae583af0d24385d9977",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "pytorch_model.bin:   0%|          | 0.00/558M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5e825ac0ab0f4f9a965cdc3e379c41be",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer_config.json:   0%|          | 0.00/19.0 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "63be8fc1c4c844af983809f12a961a27",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "vocab.txt:   0%|          | 0.00/110k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "47af0802b9be47a98671f3b579ede75d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer.json:   0%|          | 0.00/269k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "939989a1d48944ba83c7a33467d8aff3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "added_tokens.json:   0%|          | 0.00/2.00 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "91062df774ef43869f272135fc9f70dc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "special_tokens_map.json:   0%|          | 0.00/112 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.11/dist-packages/ltp/nerual.py:552: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  state_dict = torch.load(model_file, map_location=map_location)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LTP 模型加载完成。\n",
      "\n",
      "使用之前选取的评论样本进行 SRL 分析:\n",
      "\n",
      "开始对选定评论进行语义角色标注...\n",
      "调用 ltp.pipeline 处理 CWS, POS, NER, DEP, SRL...\n",
      "ltp.pipeline 处理完成。\n",
      "\n",
      "--- SRL 分析结果 ---\n",
      "\n",
      "评论 1 (好评): '非常好用功能又快不卡是一款不错的手机哈'\n",
      "分词结果: 非常 好用 功能 又 快 不 卡 是 一 款 不错 的 手机 哈\n",
      "语义角色标注 (谓词 -> 角色: 文本):\n",
      "  - 谓词: '好用' (位于索引 1)\n",
      "    - ARGM-ADV: '非常' (从 0 到 0)\n",
      "  - 谓词: '快' (位于索引 4)\n",
      "    - A0: '功能' (从 2 到 2)\n",
      "    - ARGM-DIS: '又' (从 3 到 3)\n",
      "  - 谓词: '卡' (位于索引 6)\n",
      "    - ARGM-ADV: '不' (从 5 到 5)\n",
      "  - 谓词: '是' (位于索引 7)\n",
      "    - A1: '一款不错的手机' (从 8 到 12)\n",
      "--------------------\n",
      "\n",
      "评论 2 (中评): '打开网页好卡网咯不稳定其他的还行'\n",
      "分词结果: 打开 网页 好 卡 网 咯 不 稳定 其他 的 还 行\n",
      "语义角色标注 (谓词 -> 角色: 文本):\n",
      "  - 谓词: '打开' (位于索引 0)\n",
      "    - A1: '网页' (从 1 到 1)\n",
      "  - 谓词: '卡' (位于索引 3)\n",
      "    - ARGM-ADV: '打开网页' (从 0 到 1)\n",
      "    - ARGM-ADV: '好' (从 2 到 2)\n",
      "  - 谓词: '稳定' (位于索引 7)\n",
      "    - A1: '网' (从 4 到 4)\n",
      "    - ARGM-ADV: '不' (从 6 到 6)\n",
      "  - 谓词: '行' (位于索引 11)\n",
      "    - A0: '其他的' (从 8 到 9)\n",
      "    - ARGM-ADV: '还' (从 10 到 10)\n",
      "--------------------\n",
      "\n",
      "评论 3 (差评): '经常卡机质量不行还不让退货'\n",
      "分词结果: 经常 卡机 质量 不行 还 不 让 退货\n",
      "语义角色标注 (谓词 -> 角色: 文本):\n",
      "  - 谓词: '让' (位于索引 6)\n",
      "    - ARGM-ADV: '经常卡机质量不行' (从 0 到 3)\n",
      "    - ARGM-ADV: '还' (从 4 到 4)\n",
      "    - ARGM-ADV: '不' (从 5 到 5)\n",
      "    - A2: '退货' (从 7 到 7)\n",
      "--------------------\n",
      "\n",
      "SRL 分析完成。\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from ltp import LTP\n",
    "import numpy as np\n",
    "import pandas as pd # 假设你还需要用到 pandas\n",
    "\n",
    "# --- 0. 设置和加载 LTP ---\n",
    "print(\"\\n--- 步骤 6: 使用 LTP 进行语义角色标注 (SRL) ---\")\n",
    "\n",
    "# 检查是否有可用的 GPU\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(f\"将使用设备: {device}\")\n",
    "\n",
    "# 加载 LTP 模型\n",
    "# 第一次运行时会自动下载模型 (可能需要几分钟)\n",
    "try:\n",
    "    print(\"正在加载 LTP 模型...\")\n",
    "    # 你可以选择加载基础模型 (速度快) 或更大的模型 (精度可能更高，但需要更多资源)\n",
    "    # ltp = LTP() # 默认基础模型\n",
    "    ltp = LTP(\"LTP/base\") # 明确指定基础模型路径 (推荐)\n",
    "    # 如果有 GPU，将模型移动到 GPU\n",
    "    ltp.to(device)\n",
    "    print(\"LTP 模型加载完成。\")\n",
    "except Exception as e:\n",
    "    print(f\"加载 LTP 模型时出错: {e}\")\n",
    "    print(\"请确保已安装 ltp 库 (pip install ltp) 并且网络连接正常以下载模型。\")\n",
    "    ltp = None # 标记模型加载失败\n",
    "\n",
    "# --- 1. 准备待分析的评论 ---\n",
    "# 我们复用之前选取的、长度合适的评论样本\n",
    "# 假设 sample_reviews_list 和 selected_indices 仍然存在\n",
    "if 'sample_reviews_list' in locals() and sample_reviews_list and ltp:\n",
    "    print(\"\\n使用之前选取的评论样本进行 SRL 分析:\")\n",
    "    reviews_to_analyze = sample_reviews_list\n",
    "    review_indices = selected_indices # 保留索引以获取标签\n",
    "    # 获取对应的标签名称\n",
    "    label_map = {2: '好评', 1: '中评', 0: '差评'}\n",
    "    review_labels = [label_map[df.loc[idx, '标签']] for idx in review_indices]\n",
    "\n",
    "else:\n",
    "    if not ltp:\n",
    "        print(\"LTP 模型未加载，无法进行 SRL 分析。\")\n",
    "    else:\n",
    "         print(\"\\n未找到之前的样本评论，使用预设的示例评论进行 SRL 分析:\")\n",
    "         # 如果之前的样本不在了，用一些示例\n",
    "         reviews_to_analyze = [\n",
    "             \"这款手机外观漂亮，运行流畅，拍照效果也很棒！\", # 好评\n",
    "             \"电池发热有点严重，特别是玩游戏的时候，其他还行。\", # 中评\n",
    "             \"客服态度极差，物流等了半个月，包装破损，体验糟糕透顶。\", # 差评\n",
    "             \"屏幕显示效果细腻色彩饱和度高看视频很舒服\", # 好评 (无标点测试)\n",
    "         ]\n",
    "         review_labels = [\"示例好评\", \"示例中评\", \"示例差评\", \"示例好评2\"] # 对应的标签\n",
    "         review_indices = list(range(len(reviews_to_analyze))) # 虚拟索引\n",
    "\n",
    "\n",
    "if ltp and reviews_to_analyze:\n",
    "    print(\"\\n开始对选定评论进行语义角色标注...\")\n",
    "\n",
    "    try:\n",
    "        # *** 使用 pipeline 方法执行所有必要的任务 ***\n",
    "        print(\"调用 ltp.pipeline 处理 CWS, POS, NER, DEP, SRL...\")\n",
    "        pipeline_output = ltp.pipeline(\n",
    "            reviews_to_analyze,\n",
    "            tasks=[\"cws\", \"pos\", \"ner\", \"dep\", \"srl\"] # 确保包含 cws 和 srl\n",
    "        )\n",
    "        print(\"ltp.pipeline 处理完成。\")\n",
    "\n",
    "        # --- 从 pipeline 输出中提取结果 ---\n",
    "        segmented_reviews = None\n",
    "        srl_results = None\n",
    "\n",
    "        # (提取 segmented_reviews 和 srl_results 的逻辑保持不变)\n",
    "        if isinstance(pipeline_output, dict):\n",
    "            if 'cws' in pipeline_output: segmented_reviews = pipeline_output['cws']\n",
    "            else: print(\"错误：Pipeline 输出中未找到 'cws' (分词) 结果。\")\n",
    "            if 'srl' in pipeline_output: srl_results = pipeline_output['srl']\n",
    "            else: print(\"错误：Pipeline 输出中未找到 'srl' (语义角色标注) 结果。\")\n",
    "        elif hasattr(pipeline_output, 'cws') and hasattr(pipeline_output, 'srl'):\n",
    "             segmented_reviews = pipeline_output.cws\n",
    "             srl_results = pipeline_output.srl\n",
    "        else:\n",
    "            print(f\"错误：无法识别的 pipeline 输出类型或缺少必要结果: {type(pipeline_output)}\")\n",
    "\n",
    "\n",
    "        # --- 处理并打印结果 (修改此部分以匹配新的 SRL 格式) ---\n",
    "        if segmented_reviews is not None and srl_results is not None:\n",
    "            print(\"\\n--- SRL 分析结果 ---\")\n",
    "            # 遍历每个句子的分析结果\n",
    "            for i, review in enumerate(reviews_to_analyze):\n",
    "                print(f\"\\n评论 {i+1} ({review_labels[i]}): '{review}'\")\n",
    "\n",
    "                # 检查是否有足够的分词结果\n",
    "                if i < len(segmented_reviews):\n",
    "                    words = segmented_reviews[i]\n",
    "                    print(\"分词结果:\", \" \".join(words))\n",
    "\n",
    "                    # 检查是否有足够的 SRL 结果\n",
    "                    if i < len(srl_results):\n",
    "                        sentence_srl = srl_results[i]\n",
    "                        print(\"语义角色标注 (谓词 -> 角色: 文本):\")\n",
    "                        if not sentence_srl:\n",
    "                            print(\"  (未识别到明显的谓词-角色结构)\")\n",
    "                        else:\n",
    "                            # *** 修改开始：适配字典格式 ***\n",
    "                            for srl_item in sentence_srl:\n",
    "                                # 检查 srl_item 是否为字典并包含必要键\n",
    "                                if isinstance(srl_item, dict) and all(k in srl_item for k in ['index', 'predicate', 'arguments']):\n",
    "                                    predicate_index = srl_item['index']\n",
    "                                    predicate_word = srl_item['predicate'] # 直接获取谓词文本\n",
    "                                    roles = srl_item['arguments']       # 获取角色列表\n",
    "\n",
    "                                    print(f\"  - 谓词: '{predicate_word}' (位于索引 {predicate_index})\")\n",
    "\n",
    "                                    # 检查 roles 是否为列表\n",
    "                                    if isinstance(roles, list):\n",
    "                                        if not roles:\n",
    "                                            print(\"    (该谓词未识别到角色)\")\n",
    "                                        else:\n",
    "                                            # 遍历角色列表\n",
    "                                            for role_info in roles:\n",
    "                                                # 检查 role_info 是否为包含4个元素的元组\n",
    "                                                if isinstance(role_info, tuple) and len(role_info) == 4:\n",
    "                                                    role_tag, role_text, start_idx, end_idx = role_info\n",
    "                                                    # 直接使用 role_text，无需再从 words 中提取\n",
    "                                                    print(f\"    - {role_tag}: '{role_text}' (从 {start_idx} 到 {end_idx})\")\n",
    "                                                else:\n",
    "                                                    print(f\"    警告: 角色信息格式不正确 (预期为4元组): {role_info}\")\n",
    "                                    else:\n",
    "                                        print(f\"    警告: 角色列表 'arguments' 格式不正确 (预期为列表): {roles}\")\n",
    "                                else:\n",
    "                                    # 如果格式不是预期的字典，打印警告\n",
    "                                    print(f\"  警告: SRL 条目格式不正确 (预期为字典): {srl_item}\")\n",
    "                            # *** 修改结束 ***\n",
    "                    else:\n",
    "                        print(\"  (错误: SRL 结果列表长度与评论数不匹配)\")\n",
    "                else:\n",
    "                     print(\"  (错误: 分词结果列表长度与评论数不匹配)\")\n",
    "\n",
    "                print(\"-\" * 20)\n",
    "\n",
    "            print(\"\\nSRL 分析完成。\")\n",
    "            # ... (常见角色标签说明保持不变) ...\n",
    "\n",
    "        else:\n",
    "             print(\"\\n未能从 pipeline 输出中成功提取分词或 SRL 结果，无法展示分析。\")\n",
    "\n",
    "    except Exception as e:\n",
    "        print(f\"\\n执行 LTP pipeline 时发生错误: {e}\")\n",
    "        import traceback\n",
    "        traceback.print_exc() # 打印详细的错误追踪信息\n",
    "\n",
    "else:\n",
    "    if not ltp:\n",
    "        # ltp 未加载的情况已在前面处理\n",
    "        pass\n",
    "    elif not reviews_to_analyze:\n",
    "        print(\"\\n没有可供分析的评论文本。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "e7dd9d1e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-22T14:20:54.542346Z",
     "iopub.status.busy": "2025-04-22T14:20:54.542062Z",
     "iopub.status.idle": "2025-04-22T14:20:54.546759Z",
     "shell.execute_reply": "2025-04-22T14:20:54.546054Z"
    },
    "papermill": {
     "duration": 0.046631,
     "end_time": "2025-04-22T14:20:54.547909",
     "exception": false,
     "start_time": "2025-04-22T14:20:54.501278",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.5.1+cu124'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "620ae385",
   "metadata": {
    "papermill": {
     "duration": 0.039854,
     "end_time": "2025-04-22T14:20:54.627010",
     "exception": false,
     "start_time": "2025-04-22T14:20:54.587156",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kaggle": {
   "accelerator": "nvidiaTeslaT4",
   "dataSources": [
    {
     "datasetId": 7215369,
     "sourceId": 11507640,
     "sourceType": "datasetVersion"
    },
    {
     "datasetId": 7215381,
     "sourceId": 11507656,
     "sourceType": "datasetVersion"
    },
    {
     "datasetId": 7215389,
     "sourceId": 11507665,
     "sourceType": "datasetVersion"
    },
    {
     "datasetId": 7215532,
     "sourceId": 11507860,
     "sourceType": "datasetVersion"
    }
   ],
   "dockerImageVersionId": 31011,
   "isGpuEnabled": true,
   "isInternetEnabled": true,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 2772.446478,
   "end_time": "2025-04-22T14:20:58.502210",
   "environment_variables": {},
   "exception": null,
   "input_path": "__notebook__.ipynb",
   "output_path": "__notebook__.ipynb",
   "parameters": {},
   "start_time": "2025-04-22T13:34:46.055732",
   "version": "2.6.0"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "0191cecfe8c1487f9a3f31e4fea11461": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_78a2a98ec09a4d8594c02a7544499f5e",
       "placeholder": "​",
       "style": "IPY_MODEL_d5a13c798d6a4147b9718d24c7252846",
       "tabbable": null,
       "tooltip": null,
       "value": " 269k/269k [00:00&lt;00:00, 15.4MB/s]"
      }
     },
     "039858163a3d460bb13fdb33dc229e03": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_3e55f5400fbf407c9d69156176821cbc",
       "placeholder": "​",
       "style": "IPY_MODEL_fe6153e08061470b9a016a5907d09759",
       "tabbable": null,
       "tooltip": null,
       "value": " 558M/558M [00:02&lt;00:00, 240MB/s]"
      }
     },
     "07f84c505af34b4382a4fc2e10a340d6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "09db3248b98048e1adca61e789652a6d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_d21ba63d5c2e415ea28186f5abd8a385",
        "IPY_MODEL_5451fdd6150b46789e6661509ae001ea",
        "IPY_MODEL_a0ab4562090745f3b51cb664f4c2ceba"
       ],
       "layout": "IPY_MODEL_6b0c44f8abc74387abd8f81c77bc805a",
       "tabbable": null,
       "tooltip": null
      }
     },
     "0c55fbbe8a4e4d9ca1d37b3cfc4964a5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "105e9e83fad642ed938a489230daa7ce": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "138bd00ae6404f81bb7dc9331e6f9891": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "13e29b2169814e198ee5eaeff8ad6c50": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "17f09480cef94d6b851d56fceb81ebc8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "18978ba884b847b587e11a6baaf61e39": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "19f132a034d848c5a5ebb106365ccea6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1c03c4f7e7e348b09c46ec36774656e7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "1c264f1dcf974b4a802fe13d825783dd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1e25e5859e2c4f2f8a7edc1d0cfc863e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "23b82b1f7d7d4b2c9d96108f58f2cb18": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "2524a0eec7ed49d3a476cbab510d5dea": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "26c0fbf336c843d284db572c5a5cb6a8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_3a06e3deb31c4331846f30401ae7d3f1",
       "max": 109540.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_f2eeeef431c54c38bc89857d9ae87f61",
       "tabbable": null,
       "tooltip": null,
       "value": 109540.0
      }
     },
     "27400a1969394ab79c57509338f2a0b2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "2c04a9eefa48439e98e92a8b43c008bd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "33d1f38dc95b41fab86879006ceb6341": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_6fa782ec21ca4623af4822cdad43ab03",
       "placeholder": "​",
       "style": "IPY_MODEL_5cd2e493cc7042eb990aa93ac36e9166",
       "tabbable": null,
       "tooltip": null,
       "value": " 110k/110k [00:00&lt;00:00, 5.05MB/s]"
      }
     },
     "349dd96936744037b06125c629ad5edd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "354e94be0449449792e5d7570514a673": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_a7887dcaa8f04df9a50ab467a09a2418",
       "placeholder": "​",
       "style": "IPY_MODEL_2c04a9eefa48439e98e92a8b43c008bd",
       "tabbable": null,
       "tooltip": null,
       "value": "config.json: 100%"
      }
     },
     "3877a83708b5431f974aaa7cbb455caf": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_97e5f9d3274c49e9b67c9bcef01e36bf",
       "max": 2.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_95bc77452a174e8b8915de77eac3be5d",
       "tabbable": null,
       "tooltip": null,
       "value": 2.0
      }
     },
     "38eb9936874b43c0871e42cb3be83aee": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "39c112c52eeb4e4c813266632a7478be": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_54c6e4a2fdfd4718856e0136d1476e89",
        "IPY_MODEL_eb782186a29a4b7e8326b2a1a04f38a3",
        "IPY_MODEL_b64a077137ea4b8a9b8d84d75bd5429b"
       ],
       "layout": "IPY_MODEL_796e2b7f4a174a32b148982772ce5716",
       "tabbable": null,
       "tooltip": null
      }
     },
     "3a06e3deb31c4331846f30401ae7d3f1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "3c781003ee99456cb483f17024a31478": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_ce6a92b8d8d74d85949becb90c32e7c5",
       "placeholder": "​",
       "style": "IPY_MODEL_18978ba884b847b587e11a6baaf61e39",
       "tabbable": null,
       "tooltip": null,
       "value": " 269k/269k [00:00&lt;00:00, 3.30MB/s]"
      }
     },
     "3d25f4b34dc140f58ab6b7515b61db46": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "3e55f5400fbf407c9d69156176821cbc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "3f482dbc5a8446b7a3206445b400f0d2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "41197c05152040f584a75b7c16eaeabe": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "4281f441e3f84df4a7e38a0d91b23997": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "44c66786868a46ccb4e414b946a249f0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_af5e2c1ca10447d3a887aecdc3698b86",
       "placeholder": "​",
       "style": "IPY_MODEL_2524a0eec7ed49d3a476cbab510d5dea",
       "tabbable": null,
       "tooltip": null,
       "value": " 19.0/19.0 [00:00&lt;00:00, 2.44kB/s]"
      }
     },
     "459d560e2ca84f6ea362a90bf663d371": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "45ff025dc8974c68ab5a0762780f7785": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "47af0802b9be47a98671f3b579ede75d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_aa13efe6b312476faed0361284083fc2",
        "IPY_MODEL_6c20fed54bf94e38bae67c8b8ed3e5ae",
        "IPY_MODEL_0191cecfe8c1487f9a3f31e4fea11461"
       ],
       "layout": "IPY_MODEL_af8bedfeece0468e80600292e2b71276",
       "tabbable": null,
       "tooltip": null
      }
     },
     "4818d04af17d4f4bb2c7fd05bfc1b4cd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "494c1505ab2e4dc1bf8ccefb10e08a72": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_38eb9936874b43c0871e42cb3be83aee",
       "placeholder": "​",
       "style": "IPY_MODEL_459d560e2ca84f6ea362a90bf663d371",
       "tabbable": null,
       "tooltip": null,
       "value": " 2.00/2.00 [00:00&lt;00:00, 290B/s]"
      }
     },
     "4edf81bd94be48ceb3090ddb511614e0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "5065d48a6b9a4de3b542d30e8e4e4471": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_f18ccd690b92430f9ff353d471a85d5f",
       "placeholder": "​",
       "style": "IPY_MODEL_1c03c4f7e7e348b09c46ec36774656e7",
       "tabbable": null,
       "tooltip": null,
       "value": "vocab.txt: 100%"
      }
     },
     "51412be22c814f6d8af360c6e882aa72": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "51897fc101d24570a9bff831712d9b42": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_edfc4e2bd6e24d869ee90a589ce39bbb",
        "IPY_MODEL_5ff210cfbdf54de98066e133c0bf7aa1",
        "IPY_MODEL_726e1579715545a4b60ff0bd1997317e"
       ],
       "layout": "IPY_MODEL_d20470c0c51a438c82b289fb6029b385",
       "tabbable": null,
       "tooltip": null
      }
     },
     "53539e04b1834cbb9a5dc254d1f0a0b6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "53936038e5c34dbdb487acdacbed4577": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "5451fdd6150b46789e6661509ae001ea": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_8eeb815b08264af08d9a3a08f118531c",
       "max": 49.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_d2e4de9fb89b41b698080d7213dd3033",
       "tabbable": null,
       "tooltip": null,
       "value": 49.0
      }
     },
     "54c6e4a2fdfd4718856e0136d1476e89": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_b2d7387fd16f483d954e3332da90eb0b",
       "placeholder": "​",
       "style": "IPY_MODEL_55e78a691bf2404187b51c3f5129da82",
       "tabbable": null,
       "tooltip": null,
       "value": "vocab.txt: 100%"
      }
     },
     "55e78a691bf2404187b51c3f5129da82": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "57efc119d08f4af4a3e4bb6c3ee0e78a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "5ca27cdf9c0747c0ba79f27258014d76": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "5cd2e493cc7042eb990aa93ac36e9166": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "5da44b9378764ed3869e494b9bfdc248": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "5e825ac0ab0f4f9a965cdc3e379c41be": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_b5855f89fcab4808a04de75336e94b09",
        "IPY_MODEL_ae69c2d0331c4a21acacb639b7afdece",
        "IPY_MODEL_44c66786868a46ccb4e414b946a249f0"
       ],
       "layout": "IPY_MODEL_4818d04af17d4f4bb2c7fd05bfc1b4cd",
       "tabbable": null,
       "tooltip": null
      }
     },
     "5f750219a70f4890b7542827a94a6640": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "5ff210cfbdf54de98066e133c0bf7aa1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_41197c05152040f584a75b7c16eaeabe",
       "max": 624.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_981e7294ec8644a09be11333cfe78c81",
       "tabbable": null,
       "tooltip": null,
       "value": 624.0
      }
     },
     "62ecae714a5f4198990a234c17e0a9e0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "63a24ff76b584eb18c7811c3fd426b0b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "63be8fc1c4c844af983809f12a961a27": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_5065d48a6b9a4de3b542d30e8e4e4471",
        "IPY_MODEL_26c0fbf336c843d284db572c5a5cb6a8",
        "IPY_MODEL_33d1f38dc95b41fab86879006ceb6341"
       ],
       "layout": "IPY_MODEL_934460f72d1841869d4a0394616458c8",
       "tabbable": null,
       "tooltip": null
      }
     },
     "63fc0d91a1c242ad957000306296efdc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "64241334bf4346dc831702969dc60f5d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_ab51bbce1add427ab3afddde3332695e",
       "placeholder": "​",
       "style": "IPY_MODEL_c39af3d37110449c9e1b2163538e47fe",
       "tabbable": null,
       "tooltip": null,
       "value": "special_tokens_map.json: 100%"
      }
     },
     "680563433c76456d9fbe4634a766faee": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_7efc252f33284c798f284bd3eb3893e5",
       "max": 112.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_cee302a1974849ceae945d60dfa92a20",
       "tabbable": null,
       "tooltip": null,
       "value": 112.0
      }
     },
     "6b0c44f8abc74387abd8f81c77bc805a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "6c20fed54bf94e38bae67c8b8ed3e5ae": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_749217fe9ce24924b5f765785fa17d68",
       "max": 268961.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_5f750219a70f4890b7542827a94a6640",
       "tabbable": null,
       "tooltip": null,
       "value": 268961.0
      }
     },
     "6fa782ec21ca4623af4822cdad43ab03": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "726e1579715545a4b60ff0bd1997317e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_63a24ff76b584eb18c7811c3fd426b0b",
       "placeholder": "​",
       "style": "IPY_MODEL_53936038e5c34dbdb487acdacbed4577",
       "tabbable": null,
       "tooltip": null,
       "value": " 624/624 [00:00&lt;00:00, 78.2kB/s]"
      }
     },
     "728eb914db1d4210bc61b2f3d10663ec": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "731f2a2a6a5841ddb71aae0a6b1b2282": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_45ff025dc8974c68ab5a0762780f7785",
       "placeholder": "​",
       "style": "IPY_MODEL_349dd96936744037b06125c629ad5edd",
       "tabbable": null,
       "tooltip": null,
       "value": " 412M/412M [00:01&lt;00:00, 271MB/s]"
      }
     },
     "749217fe9ce24924b5f765785fa17d68": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7580e8b929b843678d219d647a74ec77": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_7ead2c5df8d44e358462970804778a51",
       "max": 9290.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_105e9e83fad642ed938a489230daa7ce",
       "tabbable": null,
       "tooltip": null,
       "value": 9290.0
      }
     },
     "77beb7fdc3f64e5ab25e14f5e725eca3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_8f2a6e5e697f4b25ba2a248c31ff20f5",
       "max": 557512529.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_7db77ce1f191453086cdc85354939a8a",
       "tabbable": null,
       "tooltip": null,
       "value": 557512529.0
      }
     },
     "78a2a98ec09a4d8594c02a7544499f5e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "793037abb3dc4745a08c648911d44e17": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_f414302a96b0418190c5142f33df039f",
       "placeholder": "​",
       "style": "IPY_MODEL_5ca27cdf9c0747c0ba79f27258014d76",
       "tabbable": null,
       "tooltip": null,
       "value": "tokenizer.json: 100%"
      }
     },
     "796e2b7f4a174a32b148982772ce5716": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7c1f6bb53eac49f6b89e255957f25f1e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7db77ce1f191453086cdc85354939a8a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "7ead2c5df8d44e358462970804778a51": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7edfc5b3ee9f486786ad629eb4cecbf2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7efc252f33284c798f284bd3eb3893e5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "84c00bf43cf346ee912b75f9b59002c0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "883914ee085f471eb52857c4e6d1207d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_aa7fe6865ac7405da2e0c9c2a4d91d58",
        "IPY_MODEL_f05338e1b10c49418451ea9b56b0b44e",
        "IPY_MODEL_731f2a2a6a5841ddb71aae0a6b1b2282"
       ],
       "layout": "IPY_MODEL_138bd00ae6404f81bb7dc9331e6f9891",
       "tabbable": null,
       "tooltip": null
      }
     },
     "8dc1a597617e404abbd5715cbf014a03": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_bf052fd4661a479693d05a3548a366c0",
       "max": 268943.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_84c00bf43cf346ee912b75f9b59002c0",
       "tabbable": null,
       "tooltip": null,
       "value": 268943.0
      }
     },
     "8eeb815b08264af08d9a3a08f118531c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "8f2a6e5e697f4b25ba2a248c31ff20f5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "91062df774ef43869f272135fc9f70dc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_64241334bf4346dc831702969dc60f5d",
        "IPY_MODEL_680563433c76456d9fbe4634a766faee",
        "IPY_MODEL_bdda5f2445634f14a472660374d567cd"
       ],
       "layout": "IPY_MODEL_07f84c505af34b4382a4fc2e10a340d6",
       "tabbable": null,
       "tooltip": null
      }
     },
     "934460f72d1841869d4a0394616458c8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "939989a1d48944ba83c7a33467d8aff3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_bf548bcb6b2a47f5971f546c8bc29181",
        "IPY_MODEL_3877a83708b5431f974aaa7cbb455caf",
        "IPY_MODEL_494c1505ab2e4dc1bf8ccefb10e08a72"
       ],
       "layout": "IPY_MODEL_27400a1969394ab79c57509338f2a0b2",
       "tabbable": null,
       "tooltip": null
      }
     },
     "93eef33e41544cf2b21f337f9457662c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_354e94be0449449792e5d7570514a673",
        "IPY_MODEL_7580e8b929b843678d219d647a74ec77",
        "IPY_MODEL_dde8fa05cab74a928d583b0b34035ac4"
       ],
       "layout": "IPY_MODEL_1c264f1dcf974b4a802fe13d825783dd",
       "tabbable": null,
       "tooltip": null
      }
     },
     "945523dfa9624303959b4e714d829ae4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "95b947b70dbe4115801355eaa5addae8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "95bc77452a174e8b8915de77eac3be5d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "97e5f9d3274c49e9b67c9bcef01e36bf": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "981e7294ec8644a09be11333cfe78c81": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "a0ab4562090745f3b51cb664f4c2ceba": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_53539e04b1834cbb9a5dc254d1f0a0b6",
       "placeholder": "​",
       "style": "IPY_MODEL_51412be22c814f6d8af360c6e882aa72",
       "tabbable": null,
       "tooltip": null,
       "value": " 49.0/49.0 [00:00&lt;00:00, 5.66kB/s]"
      }
     },
     "a1d5a9360b494ed48789aa2daac10014": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "a27be5448bae43eeba63f782aab2a210": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "a7887dcaa8f04df9a50ab467a09a2418": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "aa13efe6b312476faed0361284083fc2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_0c55fbbe8a4e4d9ca1d37b3cfc4964a5",
       "placeholder": "​",
       "style": "IPY_MODEL_a27be5448bae43eeba63f782aab2a210",
       "tabbable": null,
       "tooltip": null,
       "value": "tokenizer.json: 100%"
      }
     },
     "aa7fe6865ac7405da2e0c9c2a4d91d58": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_95b947b70dbe4115801355eaa5addae8",
       "placeholder": "​",
       "style": "IPY_MODEL_945523dfa9624303959b4e714d829ae4",
       "tabbable": null,
       "tooltip": null,
       "value": "model.safetensors: 100%"
      }
     },
     "ab51bbce1add427ab3afddde3332695e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "ae69c2d0331c4a21acacb639b7afdece": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_ec0ac0e5837c4c1c8030aba4dc2af5cd",
       "max": 19.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_63fc0d91a1c242ad957000306296efdc",
       "tabbable": null,
       "tooltip": null,
       "value": 19.0
      }
     },
     "af5e2c1ca10447d3a887aecdc3698b86": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "af8bedfeece0468e80600292e2b71276": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "b2d7387fd16f483d954e3332da90eb0b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "b5855f89fcab4808a04de75336e94b09": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_23b82b1f7d7d4b2c9d96108f58f2cb18",
       "placeholder": "​",
       "style": "IPY_MODEL_62ecae714a5f4198990a234c17e0a9e0",
       "tabbable": null,
       "tooltip": null,
       "value": "tokenizer_config.json: 100%"
      }
     },
     "b60d2f8b2b704feb861bac4f79d82fe1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "b64a077137ea4b8a9b8d84d75bd5429b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_19f132a034d848c5a5ebb106365ccea6",
       "placeholder": "​",
       "style": "IPY_MODEL_e7b8d39b260746d6a9d5b662db4340d8",
       "tabbable": null,
       "tooltip": null,
       "value": " 110k/110k [00:00&lt;00:00, 5.10MB/s]"
      }
     },
     "b73d9ce733d44ae583af0d24385d9977": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_dbb72a57488a4730a0491101ef9fcb70",
        "IPY_MODEL_77beb7fdc3f64e5ab25e14f5e725eca3",
        "IPY_MODEL_039858163a3d460bb13fdb33dc229e03"
       ],
       "layout": "IPY_MODEL_7c1f6bb53eac49f6b89e255957f25f1e",
       "tabbable": null,
       "tooltip": null
      }
     },
     "bdda5f2445634f14a472660374d567cd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_1e25e5859e2c4f2f8a7edc1d0cfc863e",
       "placeholder": "​",
       "style": "IPY_MODEL_a1d5a9360b494ed48789aa2daac10014",
       "tabbable": null,
       "tooltip": null,
       "value": " 112/112 [00:00&lt;00:00, 15.1kB/s]"
      }
     },
     "bf02c5d2162a4a93a0789436ea43bafc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "bf052fd4661a479693d05a3548a366c0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "bf548bcb6b2a47f5971f546c8bc29181": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_3d25f4b34dc140f58ab6b7515b61db46",
       "placeholder": "​",
       "style": "IPY_MODEL_4281f441e3f84df4a7e38a0d91b23997",
       "tabbable": null,
       "tooltip": null,
       "value": "added_tokens.json: 100%"
      }
     },
     "c39af3d37110449c9e1b2163538e47fe": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "ce6a92b8d8d74d85949becb90c32e7c5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "cee302a1974849ceae945d60dfa92a20": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "d1d72d257ac1491588d7caebab0161ee": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d20470c0c51a438c82b289fb6029b385": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d21ba63d5c2e415ea28186f5abd8a385": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_13e29b2169814e198ee5eaeff8ad6c50",
       "placeholder": "​",
       "style": "IPY_MODEL_57efc119d08f4af4a3e4bb6c3ee0e78a",
       "tabbable": null,
       "tooltip": null,
       "value": "tokenizer_config.json: 100%"
      }
     },
     "d2e4de9fb89b41b698080d7213dd3033": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "d5a13c798d6a4147b9718d24c7252846": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "db00ce19e8b64b8cb62bc162cff1e447": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_793037abb3dc4745a08c648911d44e17",
        "IPY_MODEL_8dc1a597617e404abbd5715cbf014a03",
        "IPY_MODEL_3c781003ee99456cb483f17024a31478"
       ],
       "layout": "IPY_MODEL_feae0379b33f44338fd03b75ec6171d8",
       "tabbable": null,
       "tooltip": null
      }
     },
     "dbb72a57488a4730a0491101ef9fcb70": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_728eb914db1d4210bc61b2f3d10663ec",
       "placeholder": "​",
       "style": "IPY_MODEL_e56bf0d4421249e9a6efe8b92f646993",
       "tabbable": null,
       "tooltip": null,
       "value": "pytorch_model.bin: 100%"
      }
     },
     "dde8fa05cab74a928d583b0b34035ac4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_7edfc5b3ee9f486786ad629eb4cecbf2",
       "placeholder": "​",
       "style": "IPY_MODEL_3f482dbc5a8446b7a3206445b400f0d2",
       "tabbable": null,
       "tooltip": null,
       "value": " 9.29k/9.29k [00:00&lt;00:00, 895kB/s]"
      }
     },
     "e56bf0d4421249e9a6efe8b92f646993": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "e7b8d39b260746d6a9d5b662db4340d8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "eb782186a29a4b7e8326b2a1a04f38a3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_4edf81bd94be48ceb3090ddb511614e0",
       "max": 109540.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_b60d2f8b2b704feb861bac4f79d82fe1",
       "tabbable": null,
       "tooltip": null,
       "value": 109540.0
      }
     },
     "ec0ac0e5837c4c1c8030aba4dc2af5cd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "edfc4e2bd6e24d869ee90a589ce39bbb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_d1d72d257ac1491588d7caebab0161ee",
       "placeholder": "​",
       "style": "IPY_MODEL_5da44b9378764ed3869e494b9bfdc248",
       "tabbable": null,
       "tooltip": null,
       "value": "config.json: 100%"
      }
     },
     "f05338e1b10c49418451ea9b56b0b44e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_bf02c5d2162a4a93a0789436ea43bafc",
       "max": 411553788.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_17f09480cef94d6b851d56fceb81ebc8",
       "tabbable": null,
       "tooltip": null,
       "value": 411553788.0
      }
     },
     "f18ccd690b92430f9ff353d471a85d5f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "f2eeeef431c54c38bc89857d9ae87f61": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "f414302a96b0418190c5142f33df039f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "fe6153e08061470b9a016a5907d09759": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "feae0379b33f44338fd03b75ec6171d8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
